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的快取機制無關的,最終的結果便是falsenum3==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新物件,那麼就是falsenum7==num8 false
因為num8是new出來的,所以使用的記憶體地址和num7不一致,結果為falsenum9==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