近期在做一個對接京東的電商平台,所以對各個地方的效率考慮的比較多,今天深挖了一下ArrayList與LinkedList的區別以及對應List使用foreach與使用下標遍歷的效率問題,首先說一下兩種List的區別。
ArrayList是基於動態數組的數據結構,而LinkedList基於鏈表的數據結構
從根本上考慮,數組在物理地址上是連續的,而鏈表使用指針將各個元素串起來
那么基於兩種List的數據結構,可以判斷出在對數據進行查找時ArrayList比LinkedList效率高,因為數組結構的遍歷只需將下標加一,而鏈表結構則需要獲取下一節點的地址將指針移動到下一節點,而在對元素進行增刪時LinedList會比ArrayList好用,鏈表結構可以很輕松的在鏈表中間去增刪元素,而不需要改變插入節點后面元素的任何數據,但數組結構如果要在數組中間插入元素那么需要改變插入后元素的下標,但如果是在List最后加入元素那么效率上差距不大。
好了說完兩種List再來說一下foreach與下標遍歷的區別,直接上例子
這是java 文件中編寫的foreach循環
for(Object obj : list){ System.out.println(obj); }
對java文件編譯后的class文件進行反編譯得
for(java.util.Iterator i$ = list.iterator(); i$.hasNext();) { String s = (String) i$.next(); { System.out.println(s); } }
結果顯示,其實foreach其實和for在語法上沒有任何區別,唯一的區別是foreach使用了迭代器
而效率問題下面直接給出測試結果:分別在for循環與foreach循環下arrayList與linkedList的效率
在數據量1W的時候
在數據量10W的時候
首先不管怎樣 可以看到for 循環 linkedList時可以看到效率極慢,所以大家一定注意這點
再是隨着數據量的提升linkedList運行時間乘級上升,所以注意在數據量大的是一定要避免使用linkedList
然后可以看到在數據量10W之前foreach的效率比for循環效率略高
抱着懷疑的態度對1000W的循環量進行了測試結果如下
結果卻是循環下標比foreach快,為了排除偶然因素再測一遍
確認foreach在數據量比較大的情況下比下標循環要慢
那為什么會這樣呢,究其原因我覺得是ArrayList支持隨機訪問,而LinkedList使用迭代器訪問
這樣使用下標訪問效率本身很高.foreach內部封裝了幾個對下標的方法,所以自己for比foreach更直接,所以數據量大的時候效率稍高些,但差別不會太大,仍然在一個數量級上