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