1. 程式人生 > >JAVA中Integer的快取機制

JAVA中Integer的快取機制

Integer的快取機制: Integer是對小資料(-128~127)是有快取的,再jvm初始化的時候,資料-128~127之間的數字便被快取到了本地記憶體中,如果初始化-128~127之間的數字,會直接從記憶體中取出,不需要新建一個物件.

public static void main(String[] args) {

    Integer num1 = new Integer(100);
    Integer num2 = new Integer(100);
    System.out.println("num1==num2 " + (num1 == num2));     

    Integer num3 = 100
; Integer num4 = 100; System.out.println("num3==num4 " +(num3 == num4)); Integer num5 = 128; Integer num6 = 128; System.out.println("num5==num6 " + (num5 == num6)); Integer num7 = 100; Integer num8 = new Integer(100); System.out.println("num7==num8 " + (num7 == num8)); int
num9 = 100; Integer num10 = new Integer(100); Integer num11 = 100; System.out.println("num9==num10 " + (num9 == num10)); System.out.println("num9==num11 " + (num9 == num11)); } //執行之後的輸出結果是: //num1==num2 false //num3==num4 true //num5==num6 false //num7==num8 false //num9==num10 true //num9==num11 true
  • num1==num2 false
    num1和num2的記憶體地址不一樣,==的左右運算元如果是物件的話,那麼比較的是引用的地址,new產生的物件一定是新的記憶體地址,所以,這裡和Integer的快取機制無關的,最終的結果便是false

  • num3==num4 true
    num3和num4的初始化方式,直接將數字賦值,等價於下面:

Integer num3 = Integer.valueOf(100);

Integer的快取機制: Integer是對小資料(-128~127)是有快取的,再jvm初始化的時候,資料-128~127之間的數字便被快取到了本地記憶體中,如果初始化-128~127之間的數字,會直接從記憶體中取出,不需要新建一個物件.
所以,num3和num4實際上是引用的是一個記憶體地址,那麼就是true了。

  • num5==num6 false
    同上解析,128已經不在-128~127之間了,所以會new新物件,那麼就是false

  • num7==num8 false
    因為num8是new出來的,所以使用的記憶體地址和num7不一致,結果為false

  • num9==num10 true
    num9的型別是int。Integer是int的包裝類,在和int做比較的時候,會自動拆箱成int數值型別,所以,這裡便變成了數字(int)的比較。

  • num9==num11 true
    看清,num9 和 num11 .原理同上

參考:
https://www.dutycode.com/xijie_baozhuanglei_huancun_jizhi_integer_huancun.html