JAVA中ArrayList與LinkedList的區別以及對應List使用foreach與使用下標遍歷的效率問題

近期在作一個對接京東的電商平臺,因此對各個地方的效率考慮的比較多,今天深挖了一下ArrayList與LinkedList的區別以及對應List使用foreach與使用下標遍歷的效率問題,首先說一下兩種List的區別。java


ArrayList是基於動態數組的數據結構,而LinkedList基於鏈表的數據結構數組

從根本上考慮,數組在物理地址上是連續的,而鏈表使用指針將各個元素串起來數據結構

那麼基於兩種List的數據結構,能夠判斷出在對數據進行查找時ArrayList比LinkedList效率高,由於數組結構的遍歷只需將下標加一,而鏈表結構則須要獲取下一節點的地址將指針移動到下一節點,而在對元素進行增刪時LinedList會比ArrayList好用,鏈表結構能夠很輕鬆的在鏈表中間去增刪元素,而不須要改變插入節點後面元素的任何數據,但數組結構若是要在數組中間插入元素那麼須要改變插入後元素的下標,但若是是在List最後加入元素那麼效率上差距不大。測試

 

好了說完兩種List再來講一下foreach與下標遍歷的區別,直接上例子spa

這是java 文件中編寫的foreach循環指針

for(Object obj : list){
    System.out.println(obj);
}

 

對java文件編譯後的class文件進行反編譯得code

for(java.util.Iterator i$ = list.iterator(); i$.hasNext();)
   {
       String s = (String) i$.next();
       {
           System.out.println(s);
       }
   }

 

結果顯示,其實foreach其實和for在語法上沒有任何區別,惟一的區別是foreach使用了迭代器blog

 而效率問題下面直接給出測試結果:分別在for循環與foreach循環下arrayList與linkedList的效率it

在數據量1W的時候for循環

在數據量10W的時候

首先無論怎樣 能夠看到for 循環 linkedList時能夠看到效率極慢,因此你們必定注意這點

再是隨着數據量的提高linkedList運行時間乘級上升,因此注意在數據量大的是必定要避免使用linkedList

而後能夠看到在數據量10W以前foreach的效率比for循環效率略高

抱着懷疑的態度對1000W的循環量進行了測試結果以下

結果倒是循環下標比foreach快,爲了排除偶然因素再測一遍

確認foreach在數據量比較大的狀況下比下標循環要慢

那爲何會這樣呢,究其緣由我以爲是ArrayList對隨機訪問效率高

這樣使用下標訪問效率自己很高.foreach內部封裝了幾個對下標的方法,因此本身for比foreach更直接,因此數據量大的時候效率稍高些,但差異不會太大,仍然在一個數量級上

相關文章
相關標籤/搜索