關(guān)于Java的ArrayList數(shù)組自動(dòng)擴(kuò)容機(jī)制
ArrayList介紹
- ArrayList底層是基于數(shù)組實(shí)現(xiàn)的,是一個(gè)動(dòng)態(tài)數(shù)組,自動(dòng)擴(kuò)容。
- ArrayList不是線程安全的,只能用在單線程環(huán)境下。
- 實(shí)現(xiàn)了Serializable接口,因此它支持序列化,能夠通過(guò)序列化傳輸;
- 實(shí)現(xiàn)了RandomAccess接口,支持快速隨機(jī)訪問,實(shí)際上就是通過(guò)下標(biāo)序號(hào)進(jìn)行快速訪問;
- 實(shí)現(xiàn)了Cloneable接口,能被克隆。
動(dòng)態(tài)擴(kuò)容
初始化
JDK1.7通過(guò)無(wú)參構(gòu)造方法(初始長(zhǎng)度默認(rèn)10,以默認(rèn)的大小來(lái)初始化內(nèi)部的數(shù)組)、有參構(gòu)造方法對(duì)數(shù)組進(jìn)行初始化。
確保內(nèi)部容量
通過(guò)判斷,如果夠則不進(jìn)行操作;容量不夠就擴(kuò)充來(lái)確保內(nèi)部容量。
1. ensureCapacityInternal方法名的英文大致是“確保內(nèi)部容量”,size表示的是執(zhí)行添加之前的元素個(gè)數(shù),并非ArrayList的容量,容量應(yīng)該是數(shù)組elementData的長(zhǎng)度。ensureCapacityInternal該方法通過(guò)將現(xiàn)有的元素個(gè)數(shù)數(shù)組的容量比較。看如果需要擴(kuò)容,則擴(kuò)容。
2. 是將要添加的元素放置到相應(yīng)的數(shù)組中。
根據(jù)傳入的最小需要容量minCapacity來(lái)和數(shù)組的容量長(zhǎng)度對(duì)比,如果minCapacity大于或等于數(shù)組容量,則需要進(jìn)行擴(kuò)容。
擴(kuò)容
private void grow(int minCapacity) {
// overflow-conscious code
int oldCapacity = elementData.length;
// jdk1.7采用位運(yùn)算比以前的計(jì)算方式更快
int newCapacity = oldCapacity + (oldCapacity >> 1);
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
//jdk1.7這里增加了對(duì)元素個(gè)數(shù)的最大個(gè)數(shù)判斷,MAX_ARRAY_SIZE 為int最大值減去8。
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
// minCapacity is usually close to size, so this is a win:
// 最重要的復(fù)制元素方法 Arrays.copyOf()
elementData = Arrays.copyOf(elementData, newCapacity);
}綜述:ArrayList在第一次插入元素add()時(shí)分配10(默認(rèn))個(gè)對(duì)象空間。假如有20個(gè)數(shù)據(jù)需要添加,那么會(huì)在第11個(gè)數(shù)據(jù)的時(shí)候(原始數(shù)組容量存滿時(shí)),按照1.5倍增長(zhǎng);
之后擴(kuò)容會(huì)按照1.5倍增長(zhǎng)(10、15、22、、、)。
每次擴(kuò)容都是通過(guò)Arrays.copyOf(elementData, newCapacity) 這樣的方式實(shí)現(xiàn)的。ArrayList的自動(dòng)擴(kuò)容機(jī)制底層借助于System實(shí)現(xiàn)System.arraycopy(0,oldsrc,0,newsrc,length);
到此這篇關(guān)于關(guān)于Java的ArrayList數(shù)組自動(dòng)擴(kuò)容機(jī)制的文章就介紹到這了,更多相關(guān)ArrayList數(shù)組自動(dòng)擴(kuò)容內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot在項(xiàng)目停止(服務(wù)停止/關(guān)閉退出)之后執(zhí)行的方法
這篇文章主要給大家介紹了SpringBoot在項(xiàng)目停止(服務(wù)停止/關(guān)閉退出)之后執(zhí)行的兩種方法,實(shí)現(xiàn)DisposableBean接口和使用@PreDestroy注解,文中有詳細(xì)的代碼講解,具有一定的參考價(jià)值,需要的朋友可以參考下2023-12-12
springboot中關(guān)于自動(dòng)建表,無(wú)法更新字段的問題
這篇文章主要介紹了springboot中關(guān)于自動(dòng)建表,無(wú)法更新字段的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02
MySQL實(shí)現(xiàn)遠(yuǎn)程登錄的方法
Host 'Local' is not allowed to connect to this MySQL server 的解決方法,需要的朋友可以參考一下2013-03-03
Java的Synchronized關(guān)鍵字學(xué)習(xí)指南(全面 & 詳細(xì))
這篇文章主要給大家介紹了關(guān)于Java的Synchronized關(guān)鍵字的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03
Java?LocalTime的常用時(shí)間操作總結(jié)
日常開發(fā)中,?我們會(huì)經(jīng)常遇到時(shí)間的運(yùn)算,?操作,?格式化等,?這篇文章主要為大家詳細(xì)介紹了LocalTime的常用時(shí)間操作,感興趣的小伙伴可以了解一下2023-11-11
MyBatis樹形結(jié)構(gòu)查詢的實(shí)現(xiàn)示例
本文介紹了一種使用MyBatis進(jìn)行樹形結(jié)構(gòu)查詢的方法,通過(guò)構(gòu)造臨時(shí)表和內(nèi)連接,實(shí)現(xiàn)了不同層級(jí)數(shù)據(jù)的一次性查詢及映射,感興趣的可以了解一下2025-11-11
java?io文件操作從文件讀取數(shù)據(jù)的六種方法
這篇文章主要為大家介紹了java?io操作總結(jié)從文件讀取數(shù)據(jù)的六種方法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪2022-03-03
springMVC 用戶登錄權(quán)限驗(yàn)證實(shí)現(xiàn)過(guò)程解析
這篇文章主要介紹了springMVC 用戶登錄權(quán)限驗(yàn)證實(shí)現(xiàn)過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-11-11

