容器系列之ArrayList

什麼是ArrayList?

ArrayList是爲了替代數組而進行封裝的對象,依據數組的業務操作都能通過ArrayList很簡潔的實現

 

ArrayList優缺點

因爲ArrayList底層使用數組實現,所以優缺點與數組類似。

優點:

1、根據下標遍歷元素效率較高。

2、根據下標訪問元素效率較高。

3、在數組的基礎上封裝了對元素操作的方法。

4、可以自動擴容。

缺點:

1、插入和刪除的效率比較低。

2、根據內容查找元素的效率較低

 

對比數組的優勢

1.數組容量固定,ArrayList內部管理擴容,方便使用

2.ArrayList內部封裝了數組的應用業務,能夠更方便的是實現數組能實現的業務

 

ArrayList的父類與接口

RandomAccess/隨機訪問 的作用?

實現了此接口的 List,使用for循環的方式獲取數據的效率會優於用迭代器【Iterable】獲取數據(詳細解釋)

 

ArrayList的成員變量

MAX_ARRAY_SIZE爲什麼是int的最大減去8?

數組類型是由jvm從元素類型合成出來的,需要有字段記錄對象頭信息,這個8消耗在這個地方【參考解釋1參考解釋2

 

elementData是幹嘛的?

elementData是一個Object類型的數組,通過 初始化 或者 添加 的list數據都會存放在這個數組中

 

DEFAULTCAPACITY_EMPTY_ELEMENTDATA 與  EMPTY_ELEMENTDATA 的作用容易混淆,到底是幹嘛的?

DEFAULTCAPACITY_EMPTY_ELEMENTDATA 是用於通過默認構造器創建ArrayList對象賦值用的

EMPTY_ELEMENTDATA 也用於構造器默認賦值

但它還包括業務操作用清空elementData數據的邏輯操作賦值,例如:

通過上面的內容可以對他們打標籤進行區分:

1.默認爲空數組賦值

2.業務爲空數組賦值

這就延申出另外一個問題,爲什麼ArrayList需要這兩種不同的空數組賦值?

待研究

 

ArrayList的成員方法

ArrayList是怎樣動態擴容的?

DEFAULTCAPACITY_EMPTY_ELEMENTDATA  擴容與 EMPTY_ELEMENTDATA 的擴容機制並不相同,具體通過

calculateCapacity方法控制

DEFAULTCAPACITY_EMPTY_ELEMENTDATA的擴容順序是 第一次擴容大小爲10,超過當前size每次擴容當前size的1.5倍

EMPTY_ELEMENTDATA的擴容順序是 每次擴容當前size的1.5倍,若size的1.5倍等於等前size的大小,則擴容大小爲當前的size+1

【即傳參minCapacity,在add方法調用:ensureCapacityInternal(size + 1)

擴容邏輯源碼如下:

關於位運算提示

機器並不能直接識別阿拉伯數字和字母,只能進行簡單的判斷是成功還是失敗,

通過這個因素科學家將其轉意爲“成功代表1,失敗代表0”,
於是機器就能創建“000000000”“11111111”“010101010011”這樣的位碼,

但僅這個樣子人類還是無法使用機器進行簡單計算,
於是在此基礎上再次賦意建立了進制概念,什麼二進制,十進制等等

而賦意運算規則是

即 從左往右每一位都是後一位的一倍,所以最簡單的就叫 二進制

十進制的基礎是二進制,並不是位碼

錯誤示例 從右往左     ..... 100 10 1

正確示例 十進制轉換成二進制【數字10】爲

轉二進制  1 0 1 0

       賦意  8 4 2 1

即 位碼爲1部分相加爲 10

機器能夠根據二進制計算,但操作系統一般都是十進制,故需要轉換成二進制

而位運算 >> 的意思是當前位碼向左移動一位,即最後一位(最右)刪掉,前面(最左)補一位0

例如 10 >> 1 的運算步驟如下

1.轉換爲二進制

二進制   1010

2.移動位

二進制   0101

3.轉換爲十進制,結果爲5

即爲當前數量的一半

 

看到這裏,ArrayList的源碼基礎部分應該都能看懂,什麼 remove,add,get等等方法就不細說的,閱讀源碼的快樂還需要各位自己來獲取,下面講講ArrayList的進階知識

 

迭代器【Iterable】

網上都有詳細的說明迭代使用不當造成的問題,這裏不再贅述

參考文章1

參考文章2

 

拆分迭代器【Spliterator 】

參考文章1

 

後續複習繼續補充

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章