Integer a = 127;
Integer b = 127;
Integer c = 128;
Integer d = 128;
a == b 與 c == d 的比較結果是什么?
a == b 的結果為true 而 c == d的結果為false;
為什么會出現結果?百度之后發現問題的根源所在,在解決這個問題之前,先說說常量池的概念,百度百科上有
我再復述一遍。
Java常量池
常量池在java中用於保存編譯期已經確定的,它包括了關於類,方法,接口中的常量,也包括字符串常量。例如
String s = "Java" 這種聲明的方式。產生的這種"常量"就會被放到常量池,常量池是JVM的一塊特殊的內存空間。
使用Java常量池技術,是為了方便快捷地創建某些對象,當你需要一個對象時候,就去這個池子里面找,找不到就在池子里面創建一個。但是必須注意 如果對象是用new 創建的。那么不管是什么對像,它是不會放到池子里的,而是向堆申請新的空間存儲。
java中基本類型的包裝類的大部分都實現了常量池技術,這些類是Byte,Short,Integer,Long,Character,Boolean,另外兩種浮點數類型的包裝類則沒有實現。另外Byte,Short,Integer,Long,Character這5種整型的包裝類也只是在對應值小於等於127時才可使用對象池。超過了就要申請空間創建對象了
”==“ 我們知道比較的是引用的地址(其實java不要允許用戶直接對內存進行操作的的)。
當我們使用Integer a = 127 的時候 實際上調用的是下面這個方法:
1 public static Integer valueOf(int i) { 2 assert IntegerCache.high >= 127; 3 if (i >= IntegerCache.low && i <= IntegerCache.high) 4 return IntegerCache.cache[i + (-IntegerCache.low)]; 5 return new Integer(i); 6 }

可以看到low為-128,即if條件需要i在-128和127之間,那么返回i+128作為整型數組 cache的下標,用來放在緩存中。這樣也就是說任意一個相同數值的Integer的數,如果在-128和127之間,那么它們之間的內存地址是相同的。
這也就解釋了為什么Integer a=127,b=127時候a==b返回true。
而如果if條件不滿足則返回new Integer(i)。
即如果 數在 -128到127之間 就返回池子中的對象。沒有的話就創建
--------------
其實如果問題是這樣的話
Integer a = new Integer(127);
Integer b = new Integer(127);
Integer c = 128;
Integer d = 128;
a == b 一定為false 因為 沒有去找常量池,a,b都是在堆中申請了空間 返回的引用肯定不一樣。