詳解Java List的擴容機制原理及應(yīng)用
引言
在Java中,List是一種非常常用的數(shù)據(jù)結(jié)構(gòu),用于存儲有序的元素集合。List的底層實現(xiàn)有多種,如ArrayList、LinkedList等。在使用List時,我們經(jīng)常會遇到一個問題:當元素數(shù)量超過了List的初始容量時,List會如何擴容?本文將分析Java List的擴容機制原理,并通過示例代碼和測試代碼來加強闡述內(nèi)容。
List的擴容機制原理
在Java中,List的擴容機制是為了在元素數(shù)量變多時,能夠保持List的性能穩(wěn)定。當List需要擴容時,會創(chuàng)建一個更大的容量,并將舊的元素復制到新的容器中。下面我們將詳細解析ArrayList的擴容機制。
ArrayList的擴容策略
ArrayList是使用數(shù)組作為底層數(shù)據(jù)結(jié)構(gòu)來實現(xiàn)List的。當ArrayList需要擴容時,會創(chuàng)建一個新的數(shù)組來存儲元素,并將舊數(shù)組中的元素復制到新數(shù)組中。ArrayList的擴容策略如下:
- 首先,當ArrayList的元素數(shù)量超過了其數(shù)組的長度時,就會觸發(fā)擴容操作。
- 擴容時,ArrayList會創(chuàng)建一個新的容量更大的數(shù)組,通常是原數(shù)組容量的1.5倍(可以通過修改源碼進行調(diào)整)。
- 然后,ArrayList會將舊數(shù)組中的元素按順序復制到新的數(shù)組中。
- 最后,將新數(shù)組設(shè)置為ArrayList的底層數(shù)組,完成擴容操作。
通過這種擴容策略,ArrayList能夠在元素數(shù)量變多時,保持較好的性能。因為擴容操作的時間復雜度為O(n),其中n為元素數(shù)量。
擴容具體實現(xiàn)代碼
下面給出一個簡單的示例代碼,展示了ArrayList的擴容具體實現(xiàn):
public class ArrayList<E> implements List<E> { private static final int DEFAULT_CAPACITY = 10; private Object[] elementData; private int size; public ArrayList() { this.elementData = new Object[DEFAULT_CAPACITY]; this.size = 0; } public void add(E e) { ensureCapacity(size + 1); elementData[size++] = e; } private void ensureCapacity(int minCapacity) { if (minCapacity > elementData.length) { int newCapacity = elementData.length + (elementData.length >> 1); if (newCapacity < minCapacity) newCapacity = minCapacity; elementData = Arrays.copyOf(elementData, newCapacity); } } // 其他方法省略... }
在上述代碼中, ensureCapacity
方法負責擴容操作。當元素數(shù)量超過了數(shù)組長度時,會觸發(fā)擴容操作。 Arrays.copyOf
方法用于創(chuàng)建新的數(shù)組并將舊數(shù)組中的元素復制進去。
示例代碼和測試代碼
為了更好地理解和驗證ArrayList的擴容機制,下面給出了示例代碼和測試代碼:
import java.util.ArrayList; public class ArrayListResizeDemo { public static void main(String[] args) { ArrayList<Integer> list = new ArrayList<>(5); // 添加6個元素,觸發(fā)擴容 for (int i = 1; i <= 6; i++) { list.add(i); } System.out.println("List size: " + list.size()); // 輸出:6 System.out.println("List capacity: " + getArrayListCapacity(list)); // 輸出:10 } // 獲取ArrayList的容量 private static int getArrayListCapacity(ArrayList<?> list) { try { java.lang.reflect.Field capacityField = ArrayList.class.getDeclaredField("elementData"); capacityField.setAccessible(true); return ((Object[]) capacityField.get(list)).length; } catch (NoSuchFieldException | IllegalAccessException e) { e.printStackTrace(); return -1; } } }
上述示例代碼創(chuàng)建了一個初始容量為5的ArrayList,然后添加了6個元素。在添加第6個元素時,會觸發(fā)擴容操作。通過 getArrayListCapacity
方法獲取ArrayList的容量,驗證了擴容操作已經(jīng)生效。
結(jié)論
本文詳細介紹了Java List的擴容機制原理,并通過示例代碼和測試代碼加強了闡述內(nèi)容。ArrayList作為常用的List實現(xiàn)類,其擴容機制可以保持較好的性能。通過了解和理解Java中List的擴容機制,我們能夠更好地在實際開發(fā)中合理使用List。
到此這篇關(guān)于詳解Java List的擴容機制原理及應(yīng)用的文章就介紹到這了,更多相關(guān)Java List的擴容機制內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
辨析Java中的String與StringBuffer及StringBuilder字符串類
這里將為大家來辨析Java中的String與StringBuffer及StringBuilder字符串類型,通常來說StringBuilder的性能更加,需要的朋友可以參考下2016-05-05MySQL如何設(shè)置自動增長序列SEQUENCE的方法
本文主要介紹了MySQL如何設(shè)置自動增長序列SEQUENCE的方法,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-12-12httpclient staleConnectionCheckEnabled獲取連接流程解析
這篇文章主要為大家介紹了httpclient staleConnectionCheckEnabled獲取連接流程示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-11-11String.intern()作用與常量池關(guān)系示例解析
這篇文章主要為大家介紹了String.intern()作用與常量池關(guān)系示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-08-08如何開啟控制臺輸出mybatis執(zhí)行的sql日志問題
這篇文章主要介紹了如何開啟控制臺輸出mybatis執(zhí)行的sql日志問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-09-09SpringBoot實現(xiàn)單點登錄(SSO)的四種方案
單點登錄(Single?Sign-On,SSO)是企業(yè)應(yīng)用系統(tǒng)中常見的用戶認證方案,它允許用戶使用一組憑證訪問多個相關(guān)但獨立的系統(tǒng),無需重復登錄,本文給大家介紹了SpringBoot實現(xiàn)單點登錄(SSO)的四種方案,需要的朋友可以參考下2025-04-04