Arraylist、Linkedlist遍歷方式性能分析


本文主要介紹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則推薦使用迭代器方式。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM