ArrayList源代碼深入剖析
1锰霜、 集合中存放的是對象的引用,無法放置原生數(shù)據(jù)類型桐早,我們需要使用原生數(shù)據(jù)類型的包裝類才能加入到集合當(dāng)中锈遥。
2、 ArrayList底層采用數(shù)組實(shí)現(xiàn)勘畔,當(dāng)使用不帶參數(shù)的構(gòu)造方法生成ArrayList對象時所灸,實(shí)際上會在底層生成一個空的Object數(shù)組。
/**
* 存儲ArrayList元素的數(shù)組緩沖區(qū)炫七。
*ArrayList 的容量就是該數(shù)組緩沖區(qū)的長度爬立。
* 任何elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA(此處比較的是數(shù)組的地址)的
*ArrayList ,當(dāng)向其中增加第一個元素時就會將其容量擴(kuò)張為 DEFAULT_CAPACITY(10)
*/
transient Object[] elementData; // non-private to simplify nested class access
/**
* 用于默認(rèn)大小空實(shí)例的共享空數(shù)組實(shí)例万哪。 We
* 用這個屬性和EMPTY_ELEMENTDATA做區(qū)分 侠驯,獲知當(dāng)追加第一個元素時該ArrayList容量擴(kuò)大了多少
*/
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
/**
*構(gòu)造一個初始容量為10的空列表。
*/
public ArrayList() {
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}
3奕巍、 ArrayList add()方法
- 如果增加的元素個數(shù)超過了10個吟策,那么ArrayList底層會生成一個數(shù)組,長度為原數(shù)組的1.5倍的止,然后將原數(shù)組的內(nèi)容復(fù)制到新數(shù)組當(dāng)中檩坚,并且后續(xù)增加的內(nèi)容都會放到新數(shù)組當(dāng)中。當(dāng)新數(shù)組無法容納增加的元素時诅福,重復(fù)該過程匾委。
/**
* 將特定的元素追加至list末尾
*
* @param e 待追加元素
* @return <tt>true</tt> (as specified by {@link Collection#add})
*/
public boolean add(E e) {
ensureCapacityInternal(size + 1); // Increments modCount!!
elementData[size++] = e;
return true;
}
private void ensureCapacityInternal(int minCapacity) {
if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
}
ensureExplicitCapacity(minCapacity);
}
private void ensureExplicitCapacity(int minCapacity) {
modCount++;
// overflow-conscious code
if (minCapacity - elementData.length > 0)
grow(minCapacity);
}
/**
*增加容量以確保它至少容納最小容量參數(shù)指定的元素數(shù)量。
*
* @param minCapacity 所需的最小容量
*/
private void grow(int minCapacity) {
// overflow-conscious code
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + (oldCapacity >> 1); //右移一位氓润,相當(dāng)于除以2
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
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);
}