Integer a= 127 與 Integer b = 128相關


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     }
這個方法的首先斷言了IntegerCache.high的值大於等於127(關於這里assert 大於等於127解釋請看補充),否則退出方法。
接着if條件內i需要在low值和high值之間。
 

 

 

可以看到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都是在堆中申請了空間 返回的引用肯定不一樣。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM