為什么Integer 100 == Integer 100而1000 != 1000?

如果運行如下代碼

Integer a = 1000, b = 1000; 
System.out.println(a == b);
Integer c = 100, d = 100; 
System.out.println(c == d);

你會得到下面的結果

false
true

我們知道 == 比較的是引用指向的對象是否相同,內存地址是否一樣。如果查看Integer的代碼就會發現當你聲明Integer a = 100;實際上,運行的是Integer a = Integer.valueOf(100)),繼續查看ValueOf函數

public static Integer valueOf(int i) {
      if (i >= IntegerCache.low && i
          return IntegerCache.cache[i + (-IntegerCache.low)];
      return new Integer(i);
    }

如果值在-128到127之間,它就會返回該緩存的實例。至此就明白了以上問題。下面就是個很有趣的例子.

        Class cache = Integer.class.getDeclaredClasses()[0]; 
        Field myCache = cache.getDeclaredField("cache"); 
        myCache.setAccessible(true);

        Integer[] newCache = (Integer[]) myCache.get(cache); 
        newCache[132] = newCache[133]; 

        int a = 2;
        int b = a + a;
        System.out.printf("%d + %d = %d", a, a, b); 
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,993評論 19 139
  • 怎么如此平靜, 感覺像是走錯了片場.為什么呢, 因為上下游工作在同一個線程呀騷年們! 這個時候上游每次調用emit...
    Young1657閱讀 1,521評論 2 1
  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法,內部類的語法,繼承相關的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,779評論 18 399
  • 前言 看大神推薦的書單中入門有這么一本書,所以決定把這本書的精華(自認為很有用的點),或許是我自己現在能用到的點都...
    我沒有三顆心臟閱讀 2,297評論 0 6
  • 原來,我一直在被寵愛,可是他不說,所以我不知道。 我知道自己已經深深的愛上他,他亦愛我,我用了三年的時間看懂他,了...
    亞茹_我是阿茹閱讀 131評論 0 0