public class TestInteger {
/**
* @param args
*/
public static void main(String[] args) {
int i = 128;
Integer i2 = 128;
Integer i3 = new Integer(128);
//Integer會(huì)自動(dòng)拆箱為int,所以為true
System.out.println(i == i2);
System.out.println(i == i3);
System.out.println("**************");
Integer i5 = 127; //java在編譯的時(shí)候,被翻譯成-> Integer i5 = Integer.valueOf(127);
Integer i6 = 127;
System.out.println(i5 == i6);//true
/*
Integer i5 = 128;
Integer i6 = 128;
System.out.println(i5 == i6);//false
*/
Integer ii5 = new Integer(127);
System.out.println(i5 == ii5); //false
Integer i7 = new Integer(128);
Integer i8 = new Integer(123);
System.out.println(i7 == i8); //false
}
}
首先帚屉,17行和18行輸出結(jié)果都為true,因?yàn)镮nteger和int比都會(huì)自動(dòng)拆箱(jdk1.5以上)。
22行的結(jié)果為true,而25行則為false,很多人都不動(dòng)為什么漾峡。其實(shí)java在編譯Integer i5 = 127的時(shí)候,被翻譯成-> Integer i5 = Integer.valueOf(127);所以關(guān)鍵就是看valueOf()函數(shù)了涮阔。只要看看valueOf()函數(shù)的源碼就會(huì)明白了。JDK源碼的valueOf函數(shù)式這樣的:
public static Integer valueOf(int i) {
assert IntegerCache.high >= 127;
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
看一下源碼大家都會(huì)明白灰殴,對(duì)于-128到127之間的數(shù)敬特,會(huì)進(jìn)行緩存,Integer i5 = 127時(shí)牺陶,會(huì)將127進(jìn)行緩存伟阔,下次再寫(xiě)Integer i6 = 127時(shí),就會(huì)直接從緩存中取掰伸,就不會(huì)new了皱炉。所以22行的結(jié)果為true,而25行為false。
對(duì)于27行和30行狮鸭,因?yàn)閷?duì)象不一樣合搅,所以為false。
我對(duì)于以上的情況總結(jié)如下:
- 無(wú)論如何歧蕉,Integer與new Integer不會(huì)相等灾部。不會(huì)經(jīng)歷拆箱過(guò)程,i3的引用指向堆惯退,而i4指向?qū)iT(mén)存放他的內(nèi)存(常量池)赌髓,他們的內(nèi)存地址不一樣,所以為false
- 兩個(gè)都是非new出來(lái)的Integer,如果數(shù)在-128到127之間锁蠕,則是true,否則為false
java在編譯Integer i2 = 128的時(shí)候,被翻譯成-> Integer i2 = Integer.valueOf(128);而valueOf()函數(shù)會(huì)對(duì)-128到127之間的數(shù)進(jìn)行緩存 - 兩個(gè)都是new出來(lái)的,都為false
- int和integer(無(wú)論new否)比夷野,都為true,因?yàn)闀?huì)把Integer自動(dòng)拆箱為int再去比