深刻理解List集合框架底層原理的實現

前言:java

此篇文章講解ArrayList和LinkedList底層實現原理、for和foreach遍歷集合哪一個效率會更高一些!算法

講講什麼是集合框架?集合框架是爲表示和操做集合而規定的一種統一的標準的體系結構。任何集合框架都包含三大塊內容:對外的接口、接口的實現和對集合運算的算法。數組

沒學集合框架以前咱們存儲多個數據是採用數組實現的,可是咱們要建立數組的話先要初始化數組容量數據結構

 

這個時候咱們可使用到集合框架了 List 集合框架接口:
altapp

集合框架結構圖框架

List接口

public interface List<E> extends Collection <E>{} 

List接口中存儲元素的特色:異步

List中存儲的元素實現類排序,並且能夠重複的存儲相關元素。函數

(1)ArrayList:ui

優勢:操做讀取操做效率高,基於數組實現的,能夠爲null值,能夠容許重複元素,有序,異步。
缺點:因爲它是由動態數組實現的,不適合頻繁的對元素的插入和刪除操做,由於每次插入和刪除都需  要移動數組中的元素。

(2)LinkedList:spa

優勢:LinkedList由雙鏈表實現,增刪因爲不須要移動底層數組數據,其底層是鏈表實現的,只須要修改鏈表節點指針,對元素的插入和刪除效率較高。
缺點: 遍歷效率較低。HashMap和雙鏈表也有關係。

 

ArrayList成員變量

 

LinkeList成員變量

 

圖截的很差,望包涵,手有點抖

 

聊聊ArrayList和LinkeList的底層數據結構

先談談LinkedList底層數據結構

    話很少說先上圖

    

                                            -- 具備頭節點和尾節點的雙鏈表

         

                                          -- 附上一張別人的畫圖(如有侵權請及時聯繫做者刪除)

        

做者是個手殘黨畫得扭扭曲曲的

雙鏈表是鏈表的一種,它的每一個數據結點中都有兩個指針,分別指向直接後繼和直接前驅。因此,從雙向鏈表中的任意一個結點開始,均可以很方便地訪問它的前驅結點和後繼結點。通常咱們都構造雙向循環鏈表。因此刪除和插入元素只須要修改鏈表節點指針就能夠了,不像ArrayList同樣,ArrayList底層使用數組實現的,每一次刪除或修改數組都會移動元素。

 

 談談ArrayList底層數據結構

 

ArrayList底層由數組實現,在實例化一個ArrayList時沒給予構造函數數組個數參數,集合中的數組默認是10的容量,在調用add方法時若是容量已滿,會將數組的容量擴大1.5倍的容量 如圖1

若是有興趣的同窗,能夠試下實現一個MyArratList,多看看內部實現原理,便更能爲所欲爲的使用它。

 

給你們扯扯ArrayList和LinkeList的add添加元素的內部實現

   

List接口中有有不少的接口方法,如size()、isEmpty()、clear()等等.....,我就不一 一寫這麼多了。

ArrayList的添加元素方法

 

1,先從add方法提及,執行add方法裏面會先執行 ensureCapacity() 方法,先講講它是幹嗎的吧!主要是確保數組的容量是否能繼續添加元素,未聲明集合容量的話,默認是 爲10的,因此一當可用容量滿後將會把數組容量擴大1.5倍。

2,講講ensureCapacity()方法,當(元素數量+1)大於 數組長度時,會將容量擴大1.5倍,先建立一個新數組來存放數據,再擴大數組容量,最後拷貝到 elementData 數組中。

 

LinkedList的添加元素方法

1,LinkedList底層使用鏈表實現,實現添加刪除元素操做會比ArrayList效率高不少,LinkedList添加只需改變最後節點的指向便可,不會改變或挪動其餘的元素。

 

             -- 往鏈表中添加元素圖

 

使用for循環遍歷效率高仍是foreach(加強式循環)?

1,for語法

for (int i = 0; i < integers.length; i++) {

    System.out.println(intergers[i]);

}

 

2,foreach 語法

for(Integer in : integers){

    System.out.println(in);

}

 

1,使用for適合循環ArrayLIst以及數組,當大批量的循環LinkedList時程序將會卡死,for適合循環數組結構,經過下標去遍歷。

2,使用foreach適合循環LinkedList,使用雙鏈表結構實現的應當使用foreach循環。

相關文章
相關標籤/搜索