先來看個面試題
解答:
首先我們先來看下部分ArrayList的實現(xiàn)
public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
{
transient Object[] elementData; // non-private to simplify nested class access
private Object[] grow(int minCapacity) {
return elementData = Arrays.copyOf(elementData,
newCapacity(minCapacity));
}
private int newCapacity(int minCapacity) {
// overflow-conscious code
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + (oldCapacity >> 1);
if (newCapacity - minCapacity <= 0) {
if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA)
return Math.max(DEFAULT_CAPACITY, minCapacity);
if (minCapacity < 0) // overflow
throw new OutOfMemoryError();
return minCapacity;
}
return (newCapacity - MAX_ARRAY_SIZE <= 0)
? newCapacity
: hugeCapacity(minCapacity);
}
}
elementData 就是ArrayList 存放數(shù)據(jù)的數(shù)組
ArrayList 初始化 elementData 數(shù)組長度為0辱匿,放入第一個值的時候宫患,elementData 是 DEFAULTCAPACITY_EMPTY_ELEMENTDATA启泣,所以第一次擴容是DEFAULT_CAPACITY,也就是10钝尸,所以當前elementData數(shù)組長度是10匈辱, 然后放入15個值愉粤,所需數(shù)組長度是16, 大于elementData 數(shù)組長度10,需要擴容,第二次擴容是按當前數(shù)組長度的一半怔软,也就是5垦细,所以擴容長度是15,但是15比所需的長度16小挡逼,則優(yōu)化成直接擴容到所需長度也就是16括改, 所以elementData 數(shù)組長度是16
下面我們來變換下題目
假如我們放入11個值,那ArrayList的擴容過程又是怎樣家坎?
ArrayList 初始化 elementData 數(shù)組長度為0嘱能,放入第一個值的時候,elementData 是 DEFAULTCAPACITY_EMPTY_ELEMENTDATA虱疏,所以第一次擴容是DEFAULT_CAPACITY惹骂,也就是10,所以當前elementData數(shù)組長度是10做瞪, 然后放入11個值对粪,所需數(shù)組長度是12, 大于elementData 數(shù)組長度10,需要擴容穿扳,第二次擴容是按當前數(shù)組長度的一半衩侥,也就是5,所以擴容長度是15矛物,15比所需長度12大茫死,滿足條件進行擴容,所以elementData 數(shù)組長度是15
更多demo請關注
springboot demo實戰(zhàn)項目
java 腦洞
java 面試寶典
開源工具
如果這篇文章對你有幫助請給個star