== 與 equals 的恩怨情仇
阿新 • • 發佈:2019-01-03
這篇講明 == 與 equals 的區別
Java中資料型別分為基本資料型別和引用資料型別
基本資料型別不用通過new關鍵字來建立變數,直接儲存“值”並置於堆疊中,更加高效。
如:boolean、char、byte、short、int、long、float、double、void。
引用資料型別通過new關鍵字來完成建立。
如:String,Integer
== 比較的是物件的引用。
equals 適用於引用型別的比較,不能用來比較基本資料型別,基本資料型別直接使用 == 和 != 來比較 。預設比較的是物件的引用,可以對預設實現進行自定義,進行其他的比較。
例項程式碼:
public static void main(String[] args) {
int int1 = 1;
int int2 = 1;
Integer integer1 = new Integer(1);
Integer integer2 = new Integer(1);
System.out.println("基本資料型別比較:"+ (int1 == int2));
System.out.println("Integer的equals:"+integer1.equals(integer2));
System.out .println("Integer的=="+(integer1 == integer2));
}
執行結果:
基本資料型別比較:true
Integer的equals:true
Integer的==false
上面的integer1和integer2是分別new出來的,會有自己各自的地址值,也就是自己的引用,所以 == 比較的時候結果是false,但是equals的結果是true.why?,隨我進入原始碼一探究竟:
Integer原始碼片段:
public boolean equals(Object obj) {
if (obj instanceof Integer) {
return value == ((Integer)obj).intValue();
}
return false;
}
原來如此,在Integer的原始碼中equals比較的不再是引用,而是值,所以結果是true.
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;
}
Object原始碼中equals中的實現:
public boolean equals(Object obj) {
return (this == obj);
}