注:本文適用於JDK1.6及JDK1.7,更高的JDK版本未驗證過。緩存
作Java開發的都知道「==」和equals的區別,基本數據類型的值比較的時候使用「==」,對象類型的值比較的時候用equals。固然,這些都是最基本,這裏只是順便提一下。app
下面來講一些特殊的狀況:測試
第一種狀況,對於基本數據類型的包裝類,例如int對應的Integer,有時候可能也會使用「==」去比較,數值介於-128~127(含-128和127)之間不會有問題,由於Java虛擬機會在內存裏緩存這部分數據,可是在這個範圍以外的比較使用「==」就有問題了。代碼以下,一看就懂:ui
// 注:節省篇幅,註釋省掉了this
public class TestInteger {
public static void main(String[] args) {
Integer int1 = 108;
Integer int2 = 108;
Integer int3 = 168;
Integer int4 = 168;
int i1 = 168;
System.err.println(int1 == int2); // true
System.err.println(int3 == int4); // false
System.err.println(int3.equals(int4)); // true
System.err.println(int3 == i1); // true
}
}spa
結論:對於對象數據類型,不管是不是包裝類,一概使用equals來比較對象的值。(在elipse裏能夠經過findbugs檢查出此類問題)對象
第二種狀況,對於枚舉類Java開發人員應該也比較熟悉。枚舉類的比較須要注意,看枚舉類的源碼也知道,枚舉類在比較時並未進行類型檢查,Java的語法也沒有作這件事情,這意味着在有些測試不充分的狀況下容易犯錯誤。代碼以下:ip
// 注:節省篇幅,註釋省掉了內存
public class TestEnum {開發
public static void main(String[] args) {
Integer int1 = 0;
System.err.println(EFruit.apple.equals(int1)); // false 類型雖不一樣,Java語法並無強制檢查
System.err.println(EFruit.apple.getId().equals(int1)); // true
}
public enum EFruit {
apple(0, "蘋果"), orange(1, "桔子"), banana(2, "香蕉");
private Integer id;
private String name;
private EFruit(Integer id, String name) {
this.id = id;
this.name = name;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
}
結論:在進行枚舉類的比較時,要多留點心,要意識到可能有坑。
感謝你瀏覽此文,歡迎交流。勿噴,你沒給錢我也不欠你的。