Arraylist、Linkedlist遍歷方式性能分析

本文主要介紹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

相關文章
相關標籤/搜索