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

2021-10-10 16:37:43 字數 2807 閱讀 2742

前言:

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

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

沒學集合框架之前我們儲存多個資料是採用陣列實現的,但是我們要建立陣列的話先要初始化陣列容量

這個時候我們可以使用到集合框架了 list 集合框架介面:

alt!

[在這裡插入描述]

集合框架結構圖

list介面

public

inte***ce

list

extends

collection

list介面中儲存元素的特點:

list中儲存的元素實現類排序,而且可以重複的儲存相關元素。

(1)arraylist:

優點:操作讀取操作效率高,基於陣列實現的,可以為null值,可以允許重複元素,有序,非同步。

缺點:由於它是由動態陣列實現的,不適合頻繁的對元素的插入和刪除操作,因為每次插入和刪除都需 要移動陣列中的元素。

(2)linkedlist:

優點: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++)2

,foreach 語法

for(integer in : integers)

1,使用for適合迴圈arraylist以及陣列,當大批量的迴圈linkedlist時程式將會卡死,for適合迴圈陣列結構,通過下標去遍歷。

2,使用foreach適合迴圈linkedlist,使用雙鏈表結構實現的應當使用foreach迴圈。

深入理解List集合框架

前言 講講什麼是集合框架?集合框架是為表示和操作集合而規定的一種統一的標準的體系結構。任何集合框架都包含三大塊內容 對外的介面 介面的實現和對集合運算的演算法。沒學集合框架之前我們儲存多個資料是採用陣列實現的,但是我們要建立陣列的話先要初始化陣列容量 int arr new int 10 現在設定陣...

深入理解Android EventBus原理

1.定義乙個evnet public static class messageevent2.準備觀察者 宣告和注釋你的訂閱方法,可選地指定執行緒模式 subscribe threadmode threadmode.main 比如這個就指定主線程 關於型別的解釋介紹請查閱 註冊和反註冊在你的使用中,例...

深入理解springmvc 底層原理

深入理解springmvc 底層原理 web.xml 檔案中的配置 dispatcherservlet springmvc執行流程 springmvc 一切請求的入口 dispatcherservlet 對映處理器 對映 key value 作用 根據請求 url 找到乙個 method handl...