讀古今文學網 > 編寫高質量代碼:改善Java程序的151個建議 > 第5章 數組和集合 >

第5章 數組和集合

噢,他明白了,河水既沒有牛伯伯說的那麼淺,也沒有小松鼠說的那麼深,只有自己親自試過才知道。

——寓言故事《小馬過河》

數據集處理是每種語言必備的功能,Java更甚之,數據集可以允許重複,也可以不允許重複,可以允許null存在,也可以不允許null存在,可以自動排序,也可以不自動排序,可以是阻塞式的,也可以是非阻塞式的,可以是棧,也可以是隊列……

本章將圍繞我們使用最多的三個數據集合(數組、ArrayList和HashMap)來闡述在開發過程中要注意的事項,並由此延伸至Set、Queue、Stack等集合。

建議60:性能考慮,數組是首選

數組在實際的系統開發中用得越來越少了,我們通常只有在閱讀一些開源項目時才會看到它們的身影,在Java中它確實沒有List、Set、Map這些集合類用起來方便,但是在基本類型處理方面,數組還是佔優勢的,而且集合類的底層也都是通過數組實現的,比如對一個數據集求和這樣的計算:


//對數組求和

public static int sum(intdatas){

int sum=0;

for(int i=0;i<datas.length;i++){

sum+=datas[i];

}

return sum;

}


對一個int類型的數組求和,取出所有的數組元素並相加,此算法中如果是基本類型則使用數組效率是最高的,使用集合則效率次之。再看使用List求和:


//對列表求和計算

public static int sum(List<Integer>datas){

int sum=0;

for(int i=0;i<datas.size();i++){

sum+=datas.get(i);

}

return sum;

}


注意看加粗字體,這裡其實已經做了一個拆箱動作,Integer對像通過intValue方法自動轉換成了一個int基本類型,對於性能瀕於臨界的系統來說該方案是比較危險的,特別是大數量的時候,首先,在初始化List數組時要進行裝箱動作,把一個int類型包裝成一個Integer對象,雖然有整型池在,但不在整型池範圍內的都會產生一個新的Integer對象,而且眾所周知,基本類型是在棧內存中操作的,而對像則是在堆內存中操作的,棧內存的特點是速度快,容量小,堆內存的特點是速度慢,容量大(從性能上來講,基本類型的處理佔優勢)。其次,在進行求和計算(或者其他遍歷計算)時要做拆箱動作,因此無謂的性能消耗也就產生了。

在實際測試中發現:對基本類型進行求和計算時,數組的效率是集合的10倍。

注意 性能要求較高的場景中使用數組替代集合。