今天使用==和equals在比較字符串的時候遇到了問題,所以總結了一下比較時使用==和equals的區別,如下:
- 對於基本數據類型:
①==的使用:只是比較基本數據類型的值,如下:
int num1 = 12;
int num2 = 13;
System.out.println(num1 == num2);//false
System.out.println(num1);//12
char num3 = 'a';
char num4 = 'a';
System.out.println(num3 == num4);//true
System.out.println(num3);//a
- 對於引用類型:
①普通對象,使用==和使用equals效果相同,都是比較對象的地址值是否相同;
因爲每個對象都默認繼承了Object類,而Object類中的equals()方法如下:
public boolean equals(Object obj) {
return (this == obj);
}
例子如下:
Equals_MarkDistinction obj1 = new Equals_MarkDistinction();
Equals_MarkDistinction obj2 = new Equals_MarkDistinction();
System.out.println(obj1 == obj2);//false
System.out.println(obj1.equals(obj2));//false
System.out.println(obj1);//com.day3.Equals_MarkDistinction@6a2ab65b
System.out.println(obj2);//com.day3.Equals_MarkDistinction@1a2a46d1
②對於Integer、String、Date等類重寫了equals方法,所以==和equals使用不同:==比較兩個對象的地址值;equals是比較兩個對象的值是否相等;
Integer類
Integer的equals重寫了Object的equals方法,如下:
public boolean equals(Object obj) {
if (obj instanceof Integer) {
return value == ((Integer)obj).intValue();
}
return false;
}
Integer例子如下:
Integer num1 = 12;
Integer num2 = 12;
System.out.println(num1 == num2);//true
System.out.println(num1.equals(num2));//true
System.out.println(num1);//12
Integer num3 = new Integer(12);
Integer num4 = new Integer(12);
System.out.println(num3 == num4);//false
System.out.println(num3.equals(num4));//true
System.out.println(num3);//12
System.out.println(num4);//12
String類
string類重寫了Object的equals方法如下:
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String) anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
String類使用==和equals舉例如下:
String str1 = "aa";
String str2 = "aa";
System.out.println(str1 == str2);//true
System.out.println(str1);//aa
System.out.println(str2);//aa
String str3 = new String("aa");
String str4 = new String("aa");
System.out.println(str3 == str4);//false
System.out.println(str3.equals(str4));//true
System.out.println(str3);//aa
System.out.println(str4);//aa
String str5 = new String();
str5 = "aa";
String str6 = new String();
str6 = "aa";
System.out.println(str5 == str6);//true
System.out.println(str5.equals(str6));//true
System.out.println(str5);//aa
System.out.println(str6);//aa
String類的三種賦值方式內存如下:
主要知識點:
1.爲什麼Integer類和String類的對象打印出來是值,而一般的對象打印出來是一個物理地址,是應爲要在控制檯打印信息必須要調用toSting()方法,而Integer、String類重寫了Object的toString()方法:
①String類的toString()方法如下:
public String toString() {
return this;
}
②Integer的toSting()方法如下:
public static String toString(int i, int radix) {
if (radix < Character.MIN_RADIX || radix > Character.MAX_RADIX)
radix = 10;
/* Use the faster version */
if (radix == 10) {
return toString(i);
}
char buf[] = new char[33];
boolean negative = (i < 0);
int charPos = 32;
if (!negative) {
i = -i;
}
while (i <= -radix) {
buf[charPos--] = digits[-(i % radix)];
i = i / radix;
}
buf[charPos] = digits[-i];
if (negative) {
buf[--charPos] = '-';
}
return new String(buf, charPos, (33 - charPos));
}
③Object的toString()方法如下:
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}