Java中 == 與 equals方法,以及常見的 == 比較
阿新 • • 發佈:2019-02-07
1、”==”:
是算數運算子,比較的是兩個引用指向的是否是同一個記憶體地址,也就是指向的是否是同一物件。
2、equals方法:
是屬於Object的方法,是開發者自己根據具體的業務邏輯來定義該方法,用於檢查兩個物件的相等性,注意是讓開發者自己去重寫的方法。比如String類重寫了equals方法。
- Object類中的equals方法:
public boolean equals(Object obj) {
return (this == obj);
}
- String類重寫的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 ;
}
3、常見的==比較
- 基本資料型別
Java中的8個基本資料型別定義後時存在常量池中,而對應的封裝類定義後是物件。
Integer a = new Integer(128);
Integer b1 = 128;
Integer b2 = 128;
int c1 = 128;
int d2 = 128;
//false,因為a、b都是物件,且不是同一物件
System.out.println(a == b1);
//true 此時a與c比較時會自動拆箱成為基本資料型別,故此時比較為true
System.out.println(a == c1);
//true原理同上
System.out.println(b1 == c1);
//true基本資料型別定義後,存在常量池,故為true
System.out.println(c1 == c2);
//反常點來了
//false,因為b1、b2是兩個物件且不是同一物件,故為false
System.out.println(b1 == b2);
//但是b1、b2定義改為以下時:
Integer b1 = 127;//128改為127
Integer b2 = 127;
//此時照理說應該為false,但卻是為true。
System.out.println(b1 == b2);
其實java在編譯Integer b1 = 127的時候,被翻譯成-> Integer b1 = Integer.valueOf(127);所以關鍵就是看valueOf()函數了。只要看看valueOf()函式的原始碼就會明白了。JDK原始碼的valueOf函式式這樣的:
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
看一下原始碼大家都會明白,對於-128到127之間的數,會進行快取,Integer b1 = 127時,會將127進行快取,下次再寫Integer b2 = 127時,就會直接從快取中取,就不會new了。這是需要注意的一點。
- 字串型別
需要特別注意的是在String中,如果以這樣的方法定義String a = “hello”;則定義後的字串也是存在常量池中。
//定義後為物件
String a = new String("hello");
//定義後為字串常量
String b = "hello";
//定義後為物件
String c = "he"+ new String("llo");
//定義後為字串常量
String b2 = "hello";
//false是兩個不同物件
System.out.println(a == b);
//false,同上
System.out.println(a == c);
//false,同上
System.out.println(b == c);
//true,因為兩者都是字串常量
System.out.println(b == b2);