84669 人學習
152542 人學習
20005 人學習
5487 人學習
7821 人學習
359900 人學習
3350 人學習
180660 人學習
48569 人學習
18603 人學習
40936 人學習
1549 人學習
1183 人學習
32909 人學習
System.out.println(i3==i4),為什麼輸出的結果不是true
class Demo { public static void main(String[] arge) { Integer i1=100; Integer i2=100; Integer i3=200; Integer i4=200; System.out.println(i1==i2); System.out.println(i3==i4); } }
人生最曼妙的风景,竟是内心的淡定与从容!
首先我們知道,物件類型在做==時是比較其引用的記憶體位址。所以在樓主這個demo中,原則上i1==i2,i3==i4比較的都是其引用的記憶體位址,應該都是false。但是,java在java5引入了Integer快取機制,當開發者使用Integer類型時,如果定義的值在-128~127之間時,會將引用直接指向已建立好的快取物件。
在樓主的demo中,i1,i2兩個變數在-128~127之間,所以兩個變數的引用是指向同一個物件實例(記憶體位址相同),所以傳回true,而i3,i4兩個變數的值不在-128~127之間,所以jvm分別為這兩個自動裝箱的物件類型,創建了新的物件實例(記憶體位址不同),所以回傳false。
Integer快取機制的最大值可以透過jvm參數-XX:AutoBoxCacheMax=size來調整。有關Integer整型的細節及原理,請參考這篇部落格。 http://blog.csdn.net/u0110040...
整形包裝類會緩存0-150的整數對象,所以小於150都會在裝箱時候使用緩存,100是緩存中對象,200是新創建的對象
首先我們知道,物件類型在做==時是比較其引用的記憶體位址。所以在樓主這個demo中,原則上i1==i2,i3==i4比較的都是其引用的記憶體位址,應該都是false。但是,java在java5引入了Integer快取機制,當開發者使用Integer類型時,如果定義的值在-128~127之間時,會將引用直接指向已建立好的快取物件。
在樓主的demo中,i1,i2兩個變數在-128~127之間,所以兩個變數的引用是指向同一個物件實例(記憶體位址相同),所以傳回true,而i3,i4兩個變數的值不在-128~127之間,所以jvm分別為這兩個自動裝箱的物件類型,創建了新的物件實例(記憶體位址不同),所以回傳false。
Integer快取機制的最大值可以透過jvm參數-XX:AutoBoxCacheMax=size來調整。有關Integer整型的細節及原理,請參考這篇部落格。 http://blog.csdn.net/u0110040...
整形包裝類會緩存0-150的整數對象,所以小於150都會在裝箱時候使用緩存,100是緩存中對象,200是新創建的對象