關(guān)于Java的ArrayList數(shù)組自動擴(kuò)容機(jī)制
ArrayList介紹
- ArrayList底層是基于數(shù)組實(shí)現(xiàn)的,是一個動態(tài)數(shù)組,自動擴(kuò)容。
- ArrayList不是線程安全的,只能用在單線程環(huán)境下。
- 實(shí)現(xiàn)了Serializable接口,因此它支持序列化,能夠通過序列化傳輸;
- 實(shí)現(xiàn)了RandomAccess接口,支持快速隨機(jī)訪問,實(shí)際上就是通過下標(biāo)序號進(jìn)行快速訪問;
- 實(shí)現(xiàn)了Cloneable接口,能被克隆。
動態(tài)擴(kuò)容
初始化
JDK1.7通過無參構(gòu)造方法(初始長度默認(rèn)10,以默認(rèn)的大小來初始化內(nèi)部的數(shù)組)、有參構(gòu)造方法對數(shù)組進(jìn)行初始化。
確保內(nèi)部容量
通過判斷,如果夠則不進(jìn)行操作;容量不夠就擴(kuò)充來確保內(nèi)部容量。
1. ensureCapacityInternal方法名的英文大致是“確保內(nèi)部容量”,size表示的是執(zhí)行添加之前的元素個數(shù),并非ArrayList的容量,容量應(yīng)該是數(shù)組elementData的長度。ensureCapacityInternal該方法通過將現(xiàn)有的元素個數(shù)數(shù)組的容量比較??慈绻枰獢U(kuò)容,則擴(kuò)容。
2. 是將要添加的元素放置到相應(yīng)的數(shù)組中。
根據(jù)傳入的最小需要容量minCapacity來和數(shù)組的容量長度對比,如果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這里增加了對元素個數(shù)的最大個數(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))個對象空間。假如有20個數(shù)據(jù)需要添加,那么會在第11個數(shù)據(jù)的時(shí)候(原始數(shù)組容量存滿時(shí)),按照1.5倍增長;
之后擴(kuò)容會按照1.5倍增長(10、15、22、、、)。
每次擴(kuò)容都是通過Arrays.copyOf(elementData, newCapacity) 這樣的方式實(shí)現(xiàn)的。ArrayList的自動擴(kuò)容機(jī)制底層借助于System實(shí)現(xiàn)System.arraycopy(0,oldsrc,0,newsrc,length);
到此這篇關(guān)于關(guān)于Java的ArrayList數(shù)組自動擴(kuò)容機(jī)制的文章就介紹到這了,更多相關(guān)ArrayList數(shù)組自動擴(kuò)容內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java 動態(tài)代理的多種實(shí)現(xiàn)方式
動態(tài)代理實(shí)際上是JVM在運(yùn)行期動態(tài)創(chuàng)建class字節(jié)碼并加載的過程。本文講述了Java 動態(tài)代理的多種實(shí)現(xiàn)方式,感興趣的朋友可以選擇適合自己的方式2021-06-06解決IDEA開發(fā)工具右側(cè)沒有Maven工具欄的問題
這篇文章主要給大家解決了IDEA開發(fā)工具右側(cè)沒有Maven工具欄的問題,文中有詳細(xì)的解決步驟,如果有遇到一樣問題的小伙伴,可以參考閱讀本文2023-09-09java中TCP實(shí)現(xiàn)回顯服務(wù)器及客戶端
本文主要介紹了java中TCP實(shí)現(xiàn)回顯服務(wù)器及客戶端,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-02-02SpringBoot面試突擊之過濾器和攔截器區(qū)別詳解
過濾器(Filter)和攔截器(Interceptor)都是基于?AOP(Aspect?Oriented?Programming,面向切面編程)思想實(shí)現(xiàn)的,用來解決項(xiàng)目中某一類問題的兩種“工具”,但二者有著明顯的差距,接下來我們一起來看2022-10-10SpringCloud 2020-Ribbon負(fù)載均衡服務(wù)調(diào)用的實(shí)現(xiàn)
這篇文章主要介紹了SpringCloud 2020-Ribbon負(fù)載均衡服務(wù)調(diào)用的實(shí)現(xiàn),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-03Springboot整合EasyExcel實(shí)現(xiàn)Excel文件上傳方式
這篇文章主要介紹了Springboot整合EasyExcel實(shí)現(xiàn)Excel文件上傳方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-07-07解讀nextLine().split(“[\\s]“)的意思
這篇文章主要介紹了解讀nextLine().split(“[\\s]“)的意思,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-04-04淺談SpringCache與redis集成實(shí)現(xiàn)緩存解決方案
本篇文章主要介紹了淺談SpringCache與redis集成實(shí)現(xiàn)緩存解決方案,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-12-12