我的個人網站:
http://riun.xyz/
緩存區的問題
//-128~127之間的值,都是直接從IntegerCache.cache緩存區拿。無論創建多少數值,只要在此範圍內,同一數值都是指向同一個緩存區的對象,所以使用 == 判斷時,必定返回true
/*Integer i = 15;
Integer j = 15;
Integer k = 16;
System.out.println(i==j);//true
System.out.println(i==k);//false*/
//-128~127之外的值,會直接在堆上創建新的對象,無論此數值是否已被創建。所以使用 == 判斷時,無論數值爲何,總是返回false
/*Integer i = 155;
Integer j = 155;
Integer k = 166;
System.out.println(i==j);//false
System.out.println(i==k);//false*/
//只要使用new進行創建,無論創建什麼,都是在堆上創建新的對象。所以使用 == 判斷時,無論數值是否相同,總是返回false
/*Integer i = new Integer(15);
Integer j = new Integer(15);
Integer k = new Integer(16);
System.out.println(i==j);//false
System.out.println(i==k);//false*/
//Integer.valueOf(15)和Integer i = 15是同一種方式,都是去緩存區拿已有的對象引用。對於不在-128~127範圍內的數值,會創建新的對象
Integer i = Integer.valueOf(15);
Integer j = Integer.valueOf(15);
Integer k = Integer.valueOf(16);
System.out.println(i==j);//true
System.out.println(i==k);//false
/*
//valueOf源碼
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
*/