為什麼在java中,賦值和資料型別一樣的變數i3,i4,System.out.println(i3==i4),最終輸出不相等?
黄舟
黄舟 2017-06-28 09:24:50
0
2
1024

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); } }

#
黄舟
黄舟

人生最曼妙的风景,竟是内心的淡定与从容!

全部回覆 (2)
迷茫

首先我們知道,物件類型在做==時是比較其引用的記憶體位址。所以在樓主這個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是新創建的對象

      最新下載
      更多>
      網站特效
      網站源碼
      網站素材
      前端模板
      關於我們 免責聲明 Sitemap
      PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!