提高你的Java程式碼質量吧:優先使用整形池
阿新 • • 發佈:2019-01-25
一、分析
包裝型別產生物件的兩種方式:
1.new產生的Integer物件
new宣告的就是要生成一個物件,沒二話,這就是兩個物件,地址肯定不相等。
2.裝箱生成的物件
裝箱動作是通過valueOf()方法實現的,我們閱讀以下Integer.valueOf的實現程式碼:
public static Integer valueOf(int i){ final int offset = 128; if(i >= -128 && i <= 127){ return IntegerCache.cache(i + offset); } retrun new Integer(i); }
這段程式碼,如果是-128至127之間的int型別轉換為Integer物件,則直接從cache陣列中獲得,程式碼如下:
static final Integer cache[] = new Integer[-(-128) + 127 + 1];
static{
for(int i = 0; i < cache.length; i++){
cache[i] = new Integer(i-128);
}
}
cache是IntegerCache內部類的一個靜態陣列,容納的是-128到127之間的Integer物件,通過valueOf產生包裝物件時,如果int引數在-128和127之間,則直接從整形池中獲得物件,不在該範圍的int型別則通過new生成包裝物件。
二、場景
程式碼如下:
public static void main(String[] args){ Scanner input = new Scanner(System.in); while(input.hasNextInt()){ int ii = input.nextInt(); System.out.println("\n===" + ii + "的相等判斷 ==="); //通過兩個new產生的Integer物件 Integer i = new Integer(ii); Integer j = new Integer(ii); System.out.println("new 產生的物件:" + (i == j)); //基本型別轉換為包裝型別後比較 i = ii; j = ii; System.out.println("基本型別轉換的物件:" + (i == j)); //通過靜態方法生成的一個例項 i= Integer.valueOf(ii); j = Integer.valueOf(ii); System.out.println("valueOf產生的物件:" + (i == j)); } }
分別輸入127、128、55,結果如下:
===127的相等判斷===
new產生的物件:false
基本型別轉換的物件:true
valueOf產生的物件:true
===128的相等判斷===
new產生的物件:false
基本型別轉換的物件:false
valueOf產生的物件:false
===555的相等判斷===
new產生的物件:false
基本型別轉換的物件:false
valueOf產生的物件:false
通過上面的分析,127是直接從整型池中獲得的,不管你輸入多少次127數字,獲得的都是同一個物件。而128、555超出了整型範圍,是通過new產生的新物件。
三、建議
宣告包裝型別的時候,使用valueOf()生成,而不是通過建構函式生成。這樣使用整型池,不僅僅提高了系統性能,同時節約了記憶體空間。
新技術,新未來!歡迎大家關注“1024工場”微信服務號,時刻關注我們的最新的技術訊息!(甭客氣!盡情的掃描或者長按!)