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

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學習者快速成長!