前言:java
此篇文章講解ArrayList和LinkedList底層實現原理、for和foreach遍歷集合哪一個效率會更高一些!算法
講講什麼是集合框架?集合框架是爲表示和操做集合而規定的一種統一的標準的體系結構。任何集合框架都包含三大塊內容:對外的接口、接口的實現和對集合運算的算法。數組
沒學集合框架以前咱們存儲多個數據是採用數組實現的,可是咱們要建立數組的話先要初始化數組容量數據結構
這個時候咱們可使用到集合框架了 List 集合框架接口:
app
集合框架結構圖框架
public interface List<E> extends Collection <E>{}
List接口中存儲元素的特色:異步
List中存儲的元素實現類排序,並且能夠重複的存儲相關元素。函數
(1)ArrayList:ui
優勢:操做讀取操做效率高,基於數組實現的,能夠爲null值,能夠容許重複元素,有序,異步。
缺點:因爲它是由動態數組實現的,不適合頻繁的對元素的插入和刪除操做,由於每次插入和刪除都需 要移動數組中的元素。
(2)LinkedList:spa
優勢:LinkedList由雙鏈表實現,增刪因爲不須要移動底層數組數據,其底層是鏈表實現的,只須要修改鏈表節點指針,對元素的插入和刪除效率較高。
缺點: 遍歷效率較低。HashMap和雙鏈表也有關係。
圖截的很差,望包涵,手有點抖
話很少說先上圖
-- 具備頭節點和尾節點的雙鏈表
-- 附上一張別人的畫圖(如有侵權請及時聯繫做者刪除)
做者是個手殘黨畫得扭扭曲曲的
雙鏈表是鏈表的一種,它的每一個數據結點中都有兩個指針,分別指向直接後繼和直接前驅。因此,從雙向鏈表中的任意一個結點開始,均可以很方便地訪問它的前驅結點和後繼結點。通常咱們都構造雙向循環鏈表。因此刪除和插入元素只須要修改鏈表節點指針就能夠了,不像ArrayList同樣,ArrayList底層使用數組實現的,每一次刪除或修改數組都會移動元素。
ArrayList底層由數組實現,在實例化一個ArrayList時沒給予構造函數數組個數參數,集合中的數組默認是10的容量,在調用add方法時若是容量已滿,會將數組的容量擴大1.5倍的容量 如圖1
若是有興趣的同窗,能夠試下實現一個MyArratList,多看看內部實現原理,便更能爲所欲爲的使用它。
1,先從add方法提及,執行add方法裏面會先執行 ensureCapacity() 方法,先講講它是幹嗎的吧!主要是確保數組的容量是否能繼續添加元素,未聲明集合容量的話,默認是 爲10的,因此一當可用容量滿後將會把數組容量擴大1.5倍。
2,講講ensureCapacity()方法,當(元素數量+1)大於 數組長度時,會將容量擴大1.5倍,先建立一個新數組來存放數據,再擴大數組容量,最後拷貝到 elementData 數組中。
1,LinkedList底層使用鏈表實現,實現添加刪除元素操做會比ArrayList效率高不少,LinkedList添加只需改變最後節點的指向便可,不會改變或挪動其餘的元素。
-- 往鏈表中添加元素圖
for (int i = 0; i < integers.length; i++) {
System.out.println(intergers[i]);
}
for(Integer in : integers){
System.out.println(in);
}
1,使用for適合循環ArrayLIst以及數組,當大批量的循環LinkedList時程序將會卡死,for適合循環數組結構,經過下標去遍歷。
2,使用foreach適合循環LinkedList,使用雙鏈表結構實現的應當使用foreach循環。