本文主要介紹ArrayList和LinkedList這兩種list的常用循環遍歷方式,各種方式的性能分析。熟悉java的知道,常用的list的遍歷方式有以下幾種:
1、for-each
List<String> testList = new ArrayList<String>(); for (String tmp : testList) { //use tmp; }
這種遍歷方式是最常用的遍歷方式,因為書寫比較方便,而且不需要考慮數組越界的問題,Effective-Java中推薦使用此種寫法遍歷。
2、迭代器方式
List<String> testList = new ArrayList<String>(); for (Iterator<String> iterator = testList.iterator(); iterator.hasNext();) { //String tmp = iterator.next(); }
3、下標遞增或遞減循環
List<String> testList = new ArrayList<String>(); for (int i = 0; i < testList.size(); i++;) { //String tmp = testList.get(i); }
下標遞增或者遞減循環是最早接觸到的遍歷方式,會經常出現數組越界的問題。
以上三種遍歷方式是在使用list時最常用的方式,那么這三種方式在遍歷的速度已經性能上又有什么區別呢?我們從數據的底層實現上來進行分析。
List底層儲存都是使用數組來進行存儲的,ArrayList是直接通過數組來進行存儲,而LinkedList則是使用數組模擬指針,來實現鏈表的方式,因此從這里就可以總結出,ArrayList在使用下標的方式循環遍歷的時候性能最好,通過下標可以直接取數據,速度最快。而LinkedList因為有一層指針,無法直接取到對應的下標,因此在使用下標遍歷時就需要計算對應的下面是哪個元素,從指針的頭一步一步的走,所以效率就很低。想到指針就會聯想到迭代器,迭代器可以指向下一個元素,而迭代器就是使用指針來實現的,因此LinkedList在使用迭代器遍歷時會效率最高,迭代器直接通過LinkedList的指針進行遍歷,ArrayList在使用迭代器時,因為要通過ArrayList先生成指針,因此效率就會低於下標方式,而for-each又是在迭代器基礎上又進行了封裝,因此效率會更低一點,但是會很接近迭代器。
總結:在進行list遍歷時,如果是對ArrayList進行遍歷,推薦使用下標方式,如果是LinkedList則推薦使用迭代器方式。