什麼是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】
網上都有詳細的說明迭代使用不當造成的問題,這裏不再贅述
拆分迭代器【Spliterator 】
後續複習繼續補充