1. 程式人生 > >提高你的Java程式碼質量吧:優先使用整形池

提高你的Java程式碼質量吧:優先使用整形池

一、分析

包裝型別產生物件的兩種方式

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工場”微信服務號,時刻關注我們的最新的技術訊息!(甭客氣!盡情的掃描或者長按!)