首先明白兩點:
- 對于基本數(shù)據(jù)類型
==
比較的是值,而對于類==
比較的是內存地址 -
equals
由類自己實現(xiàn)河胎,默認情況下比較的是內存地址
java在1.5加入了自動裝箱和拆箱
考慮以下一個例子:
Integer a = 127;
Integer b = 128;
第一眼看上去好像沒什么區(qū)別涵亏,但其實內含玄機迫淹;
首先這里會自動裝箱炭菌,(i.e. 調用Integer.valueOf()
方法)
我們看下valueOf方法
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
這段代碼說明览效,如果i
的值在-128~127之間却舀,會直接返回IntegerCache.cache
緩存中的數(shù)據(jù)虫几,而不是new一個新的Integer锤灿。
這里IntegerCache是靜態(tài)內部類,所以只要是-128~127之間的返回的值的內存地址都是一樣的辆脸。這一點很重要但校。
現(xiàn)在我們來舉幾個例子
Integer a = 127;
Integer b = 127;
System.out.println(a == b); //true,這里a啡氢,b状囱,是同一個內存地址
Integer c = 128;
Integer d = 128;
System.out.println(c == d); //false,因為c , d都是new的
同理Long,Byte等都是這樣的原理
結論:
- java內部回把Integer倘是,Long等-128~127的值存儲在常量池中亭枷,這些值內存地址相同
- Integer,Long等比較-128~127的值時
==
和equals
都可以用于比較搀崭,否則一定要使用equals
叨粘。