首頁  >  問答  >  主體

為什麼在java中,賦值和資料型別一樣的變數i3,i4,System.out.println(i3==i4),最終輸出不相等?

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

#
黄舟黄舟2669 天前1050

全部回覆(2)我來回復

  • 迷茫

    迷茫2017-06-28 09:26:50

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

    黄舟2017-06-28 09:26:50

    整形包裝類會緩存0-150的整數對象,所以小於150都會在裝箱時候使用緩存,100是緩存中對象,200是新創建的對象

    回覆
    0
  • 取消回覆