Java之List系列--ArrayList扩容的原理
                                                            生活随笔
收集整理的這篇文章主要介紹了
                                Java之List系列--ArrayList扩容的原理
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.                        
                                原文網址:Java之List系列--ArrayList擴容的原理_IT利刃出鞘的博客-CSDN博客
簡介
說明
本文介紹Java的ArrayList是如何進行擴容的。即:擴容的機制。
重要大小
|   類  |   初始大小  |   加載因子  |   擴容倍數  |   底層實現  |   是否線程安全  |   同步方式  | 
|   ArrayList  |   10  |   1  |   1.5倍  |   Object數組  |   線程不安全  |   無  | 
|   Vector  |   10  |   1  |   2倍  |   Object數組  |   線程安全  |   synchronized  | 
下邊介紹ArrayList的擴容機制。
擴容機制
1. new一個ArrayList對象
直接new 一個ArrayList對象時(未指定初始容量大小)是一個空的數組,容量大小為零。
public ArrayList() {// DEFAULTCAPACITY_EMPTY_ELEMENTDATA 變量為一個空的數組 // private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA; }2. 調用add()方法
當第一次調用ArrayList對象的add方法時,分配容量大小
public boolean add(E e) {// size為ArrayList的實際數量大小而非容量大小,若未指定容量構建ArrayList對象,size為0ensureCapacityInternal(size + 1);? // Increments modCount!!elementData[size++] = e;return true; } private void ensureCapacityInternal(int minCapacity) {// 如果為空數組,最小需要容量為默認容量DEFAULT_CAPACITY 也就是10 // private static final int DEFAULT_CAPACITY = 10;if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);}// 調用擴容方法ensureExplicitCapacity(minCapacity); }private void ensureExplicitCapacity(int minCapacity) {//protected transient int modCount = 0;modCount++;// 如果需要的最小容量大于此時的容量,調用真正的擴容方法// overflow-conscious codeif (minCapacity - elementData.length > 0)grow(minCapacity); }3. 擴容
private void grow(int minCapacity) {// transient Object[] elementData;// overflow-conscious codeint oldCapacity = elementData.length;// 第一次擴容1.5倍int newCapacity = oldCapacity + (oldCapacity >> 1);// 還是比需要的容量小就把需要的容量作為新的容量值if (newCapacity - minCapacity < 0)newCapacity = minCapacity;// 這里主要防止1.5倍擴容導致新容量值超過數組最大容量。// 如果新的容量比數組最大容量還大,則比較需求容量和數組最大容量// 如果需求容量比數組最大容量大就取整數最大值,反之取數組最大容量if (newCapacity - MAX_ARRAY_SIZE > 0)newCapacity = hugeCapacity(minCapacity);// minCapacity is usually close to size, so this is a win:// 進行一個復制操作elementData = Arrays.copyOf(elementData, newCapacity); }/*** The maximum size of array to allocate.* Some VMs reserve some header words in an array.* Attempts to allocate larger arrays may result in* OutOfMemoryError: Requested array size exceeds VM limit*/ private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;private static int hugeCapacity(int minCapacity) {if (minCapacity < 0) // overflowthrow new OutOfMemoryError();return (minCapacity > MAX_ARRAY_SIZE) ?Integer.MAX_VALUE :MAX_ARRAY_SIZE; }其他網址
ArrayList擴容機制。_a1275118943的博客-CSDN博客
總結
以上是生活随笔為你收集整理的Java之List系列--ArrayList扩容的原理的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: CPP----C++练习100题
 - 下一篇: 2023 简单响应个人收款二维码源码 美