---
title: ArrayListæºç &æ©å®¹æºå¶åæ
category: Java
tag:
- Javaéå
---
## 1. ArrayList ç®ä»
`ArrayList` çåºå±æ¯æ°ç»éåï¼ç¸å½äºå¨ææ°ç»ãä¸ Java ä¸çæ°ç»ç¸æ¯ï¼å®ç容éè½å¨æå¢é¿ã卿·»å 大éå
ç´ åï¼åºç¨ç¨åºå¯ä»¥ä½¿ç¨`ensureCapacity`æä½æ¥å¢å `ArrayList` å®ä¾ç容éãè¿å¯ä»¥åå°éå¢å¼ååé
çæ°éã
`ArrayList`ç»§æ¿äº **`AbstractList`** ï¼å®ç°äº **`List`**, **`RandomAccess`**, **`Cloneable`**, **`java.io.Serializable`** è¿äºæ¥å£ã
```java
public class ArrayList extends AbstractList
implements List, RandomAccess, Cloneable, java.io.Serializable{
}
```
- `RandomAccess` æ¯ä¸ä¸ªæ å¿æ¥å£ï¼è¡¨æå®ç°è¿ä¸ªè¿ä¸ªæ¥å£ç List éåæ¯æ¯æ**å¿«ééæºè®¿é®**çãå¨ `ArrayList` ä¸ï¼æä»¬å³å¯ä»¥éè¿å
ç´ çåºå·å¿«éè·åå
ç´ å¯¹è±¡ï¼è¿å°±æ¯å¿«ééæºè®¿é®ã
- `ArrayList` å®ç°äº **`Cloneable` æ¥å£** ï¼å³è¦çäºå½æ°`clone()`ï¼è½è¢«å
éã
- `ArrayList` å®ç°äº `java.io.Serializable`æ¥å£ï¼è¿æå³ç`ArrayList`æ¯æåºååï¼è½éè¿åºååå»ä¼ è¾ã
### 1.1. Arraylist å Vector çåºå«?
1. `ArrayList` æ¯ `List` ç主è¦å®ç°ç±»ï¼åºå±ä½¿ç¨ `Object[ ]`åå¨ï¼éç¨äºé¢ç¹çæ¥æ¾å·¥ä½ï¼çº¿ç¨ä¸å®å
¨ ï¼
2. `Vector` æ¯ `List` çå¤èå®ç°ç±»ï¼åºå±ä½¿ç¨ `Object[ ]`åå¨ï¼çº¿ç¨å®å
¨çã
### 1.2. Arraylist ä¸ LinkedList åºå«?
1. **æ¯å¦ä¿è¯çº¿ç¨å®å
¨ï¼** `ArrayList` å `LinkedList` 齿¯ä¸åæ¥çï¼ä¹å°±æ¯ä¸ä¿è¯çº¿ç¨å®å
¨ï¼
2. **åºå±æ°æ®ç»æï¼** `Arraylist` åºå±ä½¿ç¨çæ¯ **`Object` æ°ç»**ï¼`LinkedList` åºå±ä½¿ç¨çæ¯ **ååé¾è¡¨** æ°æ®ç»æï¼JDK1.6 ä¹å为循ç¯é¾è¡¨ï¼JDK1.7 åæ¶äºå¾ªç¯ã注æååé¾è¡¨ååå循ç¯é¾è¡¨çåºå«ï¼ä¸é¢æä»ç»å°ï¼ï¼
3. **æå
¥åå 餿¯å¦åå
ç´ ä½ç½®çå½±åï¼** â **`ArrayList` éç¨æ°ç»åå¨ï¼æä»¥æå
¥åå é¤å
ç´ çæ¶é´å¤æåº¦åå
ç´ ä½ç½®çå½±åã** æ¯å¦ï¼æ§è¡`add(E e)`æ¹æ³çæ¶åï¼ `ArrayList` ä¼é»è®¤å¨å°æå®çå
ç´ è¿½å å°æ¤åè¡¨çæ«å°¾ï¼è¿ç§æ
嵿¶é´å¤æåº¦å°±æ¯ O(1)ã使¯å¦æè¦å¨æå®ä½ç½® i æå
¥åå é¤å
ç´ çè¯ï¼`add(int index, E element)`ï¼æ¶é´å¤æåº¦å°±ä¸º O(n-i)ãå 为å¨è¿è¡ä¸è¿°æä½çæ¶åéåä¸ç¬¬ i å第 i 个å
ç´ ä¹åç(n-i)个å
ç´ é½è¦æ§è¡ååä½/ååç§»ä¸ä½çæä½ã â¡ **`LinkedList` éç¨é¾è¡¨åå¨ï¼æä»¥å¯¹äº`add(E e)`æ¹æ³çæå
¥ï¼å é¤å
ç´ æ¶é´å¤æåº¦ä¸åå
ç´ ä½ç½®çå½±åï¼è¿ä¼¼ O(1)ï¼å¦ææ¯è¦å¨æå®ä½ç½®`i`æå
¥åå é¤å
ç´ çè¯ï¼`(add(int index, E element)`ï¼ æ¶é´å¤æåº¦è¿ä¼¼ä¸º`o(n))`å 为éè¦å
ç§»å¨å°æå®ä½ç½®åæå
¥ã**
4. **æ¯å¦æ¯æå¿«ééæºè®¿é®ï¼** `LinkedList` 䏿¯æé«æçéæºå
ç´ è®¿é®ï¼è `ArrayList` æ¯æãå¿«ééæºè®¿é®å°±æ¯éè¿å
ç´ çåºå·å¿«éè·åå
ç´ å¯¹è±¡(对åºäº`get(int index)`æ¹æ³)ã
5. **å
å空é´å ç¨ï¼** `ArrayList` ç空 é´æµªè´¹ä¸»è¦ä½ç°å¨å¨ list å表çç»å°¾ä¼é¢çä¸å®ç容é空é´ï¼è `LinkedList` ç空é´è±è´¹åä½ç°å¨å®çæ¯ä¸ä¸ªå
ç´ é½éè¦æ¶èæ¯ `ArrayList` æ´å¤ç空é´ï¼å 为è¦åæ¾ç´æ¥åç»§åç´æ¥å驱以忰æ®ï¼ã
## 2. ArrayList æ ¸å¿æºç 解读
```java
package java.util;
import java.util.function.Consumer;
import java.util.function.Predicate;
import java.util.function.UnaryOperator;
public class ArrayList extends AbstractList
implements List, RandomAccess, Cloneable, java.io.Serializable
{
private static final long serialVersionUID = 8683452581122892189L;
/**
* é»è®¤åå§å®¹é大å°
*/
private static final int DEFAULT_CAPACITY = 10;
/**
* 空æ°ç»ï¼ç¨äºç©ºå®ä¾ï¼ã
*/
private static final Object[] EMPTY_ELEMENTDATA = {};
//ç¨äºé»è®¤å¤§å°ç©ºå®ä¾çå
±äº«ç©ºæ°ç»å®ä¾ã
//æä»¬æå®ä»EMPTY_ELEMENTDATAæ°ç»ä¸åºååºæ¥ï¼ä»¥ç¥é卿·»å 第ä¸ä¸ªå
ç´ æ¶å®¹ééè¦å¢å å¤å°ã
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
/**
* ä¿åArrayListæ°æ®çæ°ç»
*/
transient Object[] elementData; // non-private to simplify nested class access
/**
* ArrayList æå
å«çå
ç´ ä¸ªæ°
*/
private int size;
/**
* 带åå§å®¹éåæ°çæé 彿°ï¼ç¨æ·å¯ä»¥å¨å建ArrayList对象æ¶èªå·±æå®éåçåå§å¤§å°ï¼
*/
public ArrayList(int initialCapacity) {
if (initialCapacity > 0) {
//å¦æä¼ å
¥ç忰大äº0ï¼å建initialCapacity大å°çæ°ç»
this.elementData = new Object[initialCapacity];
} else if (initialCapacity == 0) {
//å¦æä¼ å
¥çåæ°çäº0ï¼å建空æ°ç»
this.elementData = EMPTY_ELEMENTDATA;
} else {
//å
¶ä»æ
åµï¼æåºå¼å¸¸
throw new IllegalArgumentException("Illegal Capacity: "+
initialCapacity);
}
}
/**
*é»è®¤æ åæé 彿°
*DEFAULTCAPACITY_EMPTY_ELEMENTDATA 为0.åå§å为10ï¼ä¹å°±æ¯è¯´åå§å
¶å®æ¯ç©ºæ°ç» 彿·»å 第ä¸ä¸ªå
ç´ çæ¶åæ°ç»å®¹éæåæ10
*/
public ArrayList() {
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}
/**
* æé ä¸ä¸ªå
嫿å®éåçå
ç´ çåè¡¨ï¼æç
§å®ä»¬ç±éåçè¿ä»£å¨è¿åç顺åºã
*/
public ArrayList(Collection extends E> c) {
//å°æå®éå转æ¢ä¸ºæ°ç»
elementData = c.toArray();
//妿elementDataæ°ç»çé¿åº¦ä¸ä¸º0
if ((size = elementData.length) != 0) {
// 妿elementData䏿¯Objectç±»åæ°æ®ï¼c.toArrayå¯è½è¿åç䏿¯Objectç±»åçæ°ç»æä»¥å ä¸ä¸é¢çè¯å¥ç¨äºå¤æï¼
if (elementData.getClass() != Object[].class)
//å°åæ¥ä¸æ¯Objectç±»åçelementDataæ°ç»çå
容ï¼èµå¼ç»æ°çObjectç±»åçelementDataæ°ç»
elementData = Arrays.copyOf(elementData, size, Object[].class);
} else {
// å
¶ä»æ
åµï¼ç¨ç©ºæ°ç»ä»£æ¿
this.elementData = EMPTY_ELEMENTDATA;
}
}
/**
* ä¿®æ¹è¿ä¸ªArrayListå®ä¾ç容鿝å表çå½å大å°ã åºç¨ç¨åºå¯ä»¥ä½¿ç¨æ¤æä½æ¥æå°åArrayListå®ä¾çåå¨ã
*/
public void trimToSize() {
modCount++;
if (size < elementData.length) {
elementData = (size == 0)
? EMPTY_ELEMENTDATA
: Arrays.copyOf(elementData, size);
}
}
//ä¸é¢æ¯ArrayListçæ©å®¹æºå¶
//ArrayListçæ©å®¹æºå¶æé«äºæ§è½ï¼å¦ææ¯æ¬¡åªæ©å
ä¸ä¸ªï¼
//é£ä¹é¢ç¹çæå
¥ä¼å¯¼è´é¢ç¹çæ·è´ï¼é使§è½ï¼èArrayListçæ©å®¹æºå¶é¿å
äºè¿ç§æ
åµã
/**
* 妿å¿
è¦ï¼å¢å æ¤ArrayListå®ä¾ç容éï¼ä»¥ç¡®ä¿å®è³å°è½å®¹çº³å
ç´ çæ°é
* @param minCapacity æéçæå°å®¹é
*/
public void ensureCapacity(int minCapacity) {
//妿æ¯trueï¼minExpandçå¼ä¸º0ï¼å¦ææ¯false,minExpandçå¼ä¸º10
int minExpand = (elementData != DEFAULTCAPACITY_EMPTY_ELEMENTDATA)
// any size if not default element table
? 0
// larger than default for default empty table. It's already
// supposed to be at default size.
: DEFAULT_CAPACITY;
//妿æå°å®¹é大äºå·²æçæå¤§å®¹é
if (minCapacity > minExpand) {
ensureExplicitCapacity(minCapacity);
}
}
//1.å¾å°æå°æ©å®¹é
//2.éè¿æå°å®¹éæ©å®¹
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æ¹æ³è¿è¡æ©å®¹ï¼è°ç¨æ¤æ¹æ³ä»£è¡¨å·²ç»å¼å§æ©å®¹äº
grow(minCapacity);
}
/**
* è¦åé
çæå¤§æ°ç»å¤§å°
*/
private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
/**
* ArrayListæ©å®¹çæ ¸å¿æ¹æ³ã
*/
private void grow(int minCapacity) {
// oldCapacity为æ§å®¹éï¼newCapacity为æ°å®¹é
int oldCapacity = elementData.length;
//å°oldCapacity å³ç§»ä¸ä½ï¼å
¶ææç¸å½äºoldCapacity /2ï¼
//æä»¬ç¥éä½è¿ç®çé度è¿è¿å¿«äºæ´é¤è¿ç®ï¼æ´å¥è¿ç®å¼çç»æå°±æ¯å°æ°å®¹éæ´æ°ä¸ºæ§å®¹éç1.5åï¼
int newCapacity = oldCapacity + (oldCapacity >> 1);
//ç¶åæ£æ¥æ°å®¹éæ¯å¦å¤§äºæå°éè¦å®¹éï¼è¥è¿æ¯å°äºæå°éè¦å®¹éï¼é£ä¹å°±ææå°éè¦å®¹éå½ä½æ°ç»çæ°å®¹éï¼
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
//åæ£æ¥æ°å®¹éæ¯å¦è¶
åºäºArrayListæå®ä¹çæå¤§å®¹éï¼
//è¥è¶
åºäºï¼åè°ç¨hugeCapacity()æ¥æ¯è¾minCapacityå MAX_ARRAY_SIZEï¼
//妿minCapacity大äºMAX_ARRAY_SIZEï¼åæ°å®¹éå为Interger.MAX_VALUEï¼å¦åï¼æ°å®¹é大å°å为 MAX_ARRAY_SIZEã
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);
}
//æ¯è¾minCapacityå MAX_ARRAY_SIZE
private static int hugeCapacity(int minCapacity) {
if (minCapacity < 0) // overflow
throw new OutOfMemoryError();
return (minCapacity > MAX_ARRAY_SIZE) ?
Integer.MAX_VALUE :
MAX_ARRAY_SIZE;
}
/**
*è¿åæ¤å表ä¸çå
ç´ æ°ã
*/
public int size() {
return size;
}
/**
* 妿æ¤å表ä¸å
å«å
ç´ ï¼åè¿å true ã
*/
public boolean isEmpty() {
//注æ=å==çåºå«
return size == 0;
}
/**
* 妿æ¤å表å
嫿å®çå
ç´ ï¼åè¿åtrue ã
*/
public boolean contains(Object o) {
//indexOf()æ¹æ³ï¼è¿åæ¤åè¡¨ä¸æå®å
ç´ ç馿¬¡åºç°çç´¢å¼ï¼å¦ææ¤å表ä¸å
嫿¤å
ç´ ï¼å为-1
return indexOf(o) >= 0;
}
/**
*è¿åæ¤åè¡¨ä¸æå®å
ç´ ç馿¬¡åºç°çç´¢å¼ï¼å¦ææ¤å表ä¸å
嫿¤å
ç´ ï¼å为-1
*/
public int indexOf(Object o) {
if (o == null) {
for (int i = 0; i < size; i++)
if (elementData[i]==null)
return i;
} else {
for (int i = 0; i < size; i++)
//equals()æ¹æ³æ¯è¾
if (o.equals(elementData[i]))
return i;
}
return -1;
}
/**
* è¿åæ¤åè¡¨ä¸æå®å
ç´ çæå䏿¬¡åºç°çç´¢å¼ï¼å¦ææ¤å表ä¸å
å«å
ç´ ï¼åè¿å-1ã.
*/
public int lastIndexOf(Object o) {
if (o == null) {
for (int i = size-1; i >= 0; i--)
if (elementData[i]==null)
return i;
} else {
for (int i = size-1; i >= 0; i--)
if (o.equals(elementData[i]))
return i;
}
return -1;
}
/**
* è¿åæ¤ArrayListå®ä¾çæµ
æ·è´ã ï¼å
ç´ æ¬èº«ä¸è¢«å¤å¶ãï¼
*/
public Object clone() {
try {
ArrayList> v = (ArrayList>) super.clone();
//Arrays.copyOfåè½æ¯å®ç°æ°ç»çå¤å¶ï¼è¿åå¤å¶åçæ°ç»ãåæ°æ¯è¢«å¤å¶çæ°ç»åå¤å¶çé¿åº¦
v.elementData = Arrays.copyOf(elementData, size);
v.modCount = 0;
return v;
} catch (CloneNotSupportedException e) {
// è¿ä¸åºè¯¥åçï¼å 为æä»¬æ¯å¯ä»¥å
éç
throw new InternalError(e);
}
}
/**
*以æ£ç¡®ç顺åºï¼ä»ç¬¬ä¸ä¸ªå°æåä¸ä¸ªå
ç´ ï¼è¿åä¸ä¸ªå
嫿¤åè¡¨ä¸ææå
ç´ çæ°ç»ã
*è¿åçæ°ç»å°æ¯âå®å
¨çâï¼å 为该å表ä¸ä¿ç对å®çå¼ç¨ã ï¼æ¢å¥è¯è¯´ï¼è¿ä¸ªæ¹æ³å¿
é¡»åé
ä¸ä¸ªæ°çæ°ç»ï¼ã
*å æ¤ï¼è°ç¨è
å¯ä»¥èªç±å°ä¿®æ¹è¿åçæ°ç»ã æ¤æ¹æ³å
å½åºäºéµåååºäºéåçAPIä¹é´çæ¡¥æ¢ã
*/
public Object[] toArray() {
return Arrays.copyOf(elementData, size);
}
/**
* 以æ£ç¡®ç顺åºè¿åä¸ä¸ªå
嫿¤åè¡¨ä¸ææå
ç´ çæ°ç»ï¼ä»ç¬¬ä¸ä¸ªå°æåä¸ä¸ªå
ç´ ï¼;
*è¿åçæ°ç»çè¿è¡æ¶ç±»åæ¯æå®æ°ç»çè¿è¡æ¶ç±»åã 妿å表éåæå®çæ°ç»ï¼åè¿åå
¶ä¸ã
*å¦åï¼å°ä¸ºæå®æ°ç»çè¿è¡æ¶ç±»å忤å表ç大å°åé
ä¸ä¸ªæ°æ°ç»ã
*妿å表éç¨äºæå®çæ°ç»ï¼å
¶ä½ç©ºé´ï¼å³æ°ç»çå表æ°éå¤äºæ¤å
ç´ ï¼ï¼åç´§è·å¨éåç»æåçæ°ç»ä¸çå
ç´ è®¾ç½®ä¸ºnull ã
*ï¼è¿ä»
å¨è°ç¨è
ç¥éå表ä¸å
å«ä»»ä½ç©ºå
ç´ çæ
åµä¸æè½ç¡®å®å表çé¿åº¦ãï¼
*/
@SuppressWarnings("unchecked")
public T[] toArray(T[] a) {
if (a.length < size)
// æ°å»ºä¸ä¸ªè¿è¡æ¶ç±»åçæ°ç»ï¼ä½æ¯ArrayListæ°ç»çå
容
return (T[]) Arrays.copyOf(elementData, size, a.getClass());
//è°ç¨Systemæä¾çarraycopy()æ¹æ³å®ç°æ°ç»ä¹é´çå¤å¶
System.arraycopy(elementData, 0, a, 0, size);
if (a.length > size)
a[size] = null;
return a;
}
// Positional Access Operations
@SuppressWarnings("unchecked")
E elementData(int index) {
return (E) elementData[index];
}
/**
* è¿åæ¤åè¡¨ä¸æå®ä½ç½®çå
ç´ ã
*/
public E get(int index) {
rangeCheck(index);
return elementData(index);
}
/**
* ç¨æå®çå
ç´ æ¿æ¢æ¤åè¡¨ä¸æå®ä½ç½®çå
ç´ ã
*/
public E set(int index, E element) {
//对indexè¿è¡ç鿣æ¥
rangeCheck(index);
E oldValue = elementData(index);
elementData[index] = element;
//è¿å忥å¨è¿ä¸ªä½ç½®çå
ç´
return oldValue;
}
/**
* å°æå®çå
ç´ è¿½å å°æ¤åè¡¨çæ«å°¾ã
*/
public boolean add(E e) {
ensureCapacityInternal(size + 1); // Increments modCount!!
//è¿éçå°ArrayListæ·»å å
ç´ çå®è´¨å°±ç¸å½äºä¸ºæ°ç»èµå¼
elementData[size++] = e;
return true;
}
/**
* 卿¤å表ä¸çæå®ä½ç½®æå
¥æå®çå
ç´ ã
*å
è°ç¨ rangeCheckForAdd 对indexè¿è¡ç鿣æ¥ï¼ç¶åè°ç¨ ensureCapacityInternal æ¹æ³ä¿è¯capacityè¶³å¤å¤§ï¼
*åå°ä»indexå¼å§ä¹åçæææååç§»ä¸ä¸ªä½ç½®ï¼å°elementæå
¥indexä½ç½®ï¼æåsizeå 1ã
*/
public void add(int index, E element) {
rangeCheckForAdd(index);
ensureCapacityInternal(size + 1); // Increments modCount!!
//arraycopy()è¿ä¸ªå®ç°æ°ç»ä¹é´å¤å¶çæ¹æ³ä¸å®è¦çä¸ä¸ï¼ä¸é¢å°±ç¨å°äºarraycopy()æ¹æ³å®ç°æ°ç»èªå·±å¤å¶èªå·±
System.arraycopy(elementData, index, elementData, index + 1,
size - index);
elementData[index] = element;
size++;
}
/**
* å é¤è¯¥åè¡¨ä¸æå®ä½ç½®çå
ç´ ã å°ä»»ä½åç»å
ç´ ç§»å¨å°å·¦ä¾§ï¼ä»å
¶ç´¢å¼ä¸åå»ä¸ä¸ªå
ç´ ï¼ã
*/
public E remove(int index) {
rangeCheck(index);
modCount++;
E oldValue = elementData(index);
int numMoved = size - index - 1;
if (numMoved > 0)
System.arraycopy(elementData, index+1, elementData, index,
numMoved);
elementData[--size] = null; // clear to let GC do its work
//ä»å表ä¸å é¤çå
ç´
return oldValue;
}
/**
* ä»å表ä¸å 餿å®å
ç´ ç第ä¸ä¸ªåºç°ï¼å¦æåå¨ï¼ã 妿å表ä¸å
å«è¯¥å
ç´ ï¼åå®ä¸ä¼æ´æ¹ã
*è¿åtrueï¼å¦ææ¤å表å
嫿å®çå
ç´
*/
public boolean remove(Object o) {
if (o == null) {
for (int index = 0; index < size; index++)
if (elementData[index] == null) {
fastRemove(index);
return true;
}
} else {
for (int index = 0; index < size; index++)
if (o.equals(elementData[index])) {
fastRemove(index);
return true;
}
}
return false;
}
/*
* Private remove method that skips bounds checking and does not
* return the value removed.
*/
private void fastRemove(int index) {
modCount++;
int numMoved = size - index - 1;
if (numMoved > 0)
System.arraycopy(elementData, index+1, elementData, index,
numMoved);
elementData[--size] = null; // clear to let GC do its work
}
/**
* ä»å表ä¸å 餿æå
ç´ ã
*/
public void clear() {
modCount++;
// ææ°ç»ä¸ææçå
ç´ çå¼è®¾ä¸ºnull
for (int i = 0; i < size; i++)
elementData[i] = null;
size = 0;
}
/**
* ææå®éåçIteratorè¿åç顺åºå°æå®éåä¸çææå
ç´ è¿½å å°æ¤åè¡¨çæ«å°¾ã
*/
public boolean addAll(Collection extends E> c) {
Object[] a = c.toArray();
int numNew = a.length;
ensureCapacityInternal(size + numNew); // Increments modCount
System.arraycopy(a, 0, elementData, size, numNew);
size += numNew;
return numNew != 0;
}
/**
* å°æå®éåä¸çææå
ç´ æå
¥å°æ¤å表ä¸ï¼ä»æå®çä½ç½®å¼å§ã
*/
public boolean addAll(int index, Collection extends E> c) {
rangeCheckForAdd(index);
Object[] a = c.toArray();
int numNew = a.length;
ensureCapacityInternal(size + numNew); // Increments modCount
int numMoved = size - index;
if (numMoved > 0)
System.arraycopy(elementData, index, elementData, index + numNew,
numMoved);
System.arraycopy(a, 0, elementData, index, numNew);
size += numNew;
return numNew != 0;
}
/**
* 仿¤å表ä¸å 餿æç´¢å¼ä¸ºfromIndex ï¼å«ï¼åtoIndexä¹é´çå
ç´ ã
*å°ä»»ä½åç»å
ç´ ç§»å¨å°å·¦ä¾§ï¼åå°å
¶ç´¢å¼ï¼ã
*/
protected void removeRange(int fromIndex, int toIndex) {
modCount++;
int numMoved = size - toIndex;
System.arraycopy(elementData, toIndex, elementData, fromIndex,
numMoved);
// clear to let GC do its work
int newSize = size - (toIndex-fromIndex);
for (int i = newSize; i < size; i++) {
elementData[i] = null;
}
size = newSize;
}
/**
* æ£æ¥ç»å®çç´¢å¼æ¯å¦å¨èå´å
ã
*/
private void rangeCheck(int index) {
if (index >= size)
throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
}
/**
* addåaddAll使ç¨çrangeCheckçä¸ä¸ªçæ¬
*/
private void rangeCheckForAdd(int index) {
if (index > size || index < 0)
throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
}
/**
* è¿åIndexOutOfBoundsExceptionç»èä¿¡æ¯
*/
private String outOfBoundsMsg(int index) {
return "Index: "+index+", Size: "+size;
}
/**
* 仿¤å表ä¸å 餿å®éåä¸å
å«çææå
ç´ ã
*/
public boolean removeAll(Collection> c) {
Objects.requireNonNull(c);
//妿æ¤å表被修æ¹åè¿åtrue
return batchRemove(c, false);
}
/**
* ä»
ä¿çæ¤å表ä¸å
å«å¨æå®éåä¸çå
ç´ ã
*æ¢å¥è¯è¯´ï¼ä»æ¤å表ä¸å é¤å
¶ä¸ä¸å
å«å¨æå®éåä¸çææå
ç´ ã
*/
public boolean retainAll(Collection> c) {
Objects.requireNonNull(c);
return batchRemove(c, true);
}
/**
* ä»å表ä¸çæå®ä½ç½®å¼å§ï¼è¿åå表ä¸çå
ç´ ï¼ææ£ç¡®é¡ºåºï¼çå表è¿ä»£å¨ã
*æå®çç´¢å¼è¡¨ç¤ºåå§è°ç¨å°è¿åç第ä¸ä¸ªå
ç´ ä¸ºnext ã åå§è°ç¨previouså°è¿åæå®ç´¢å¼å1çå
ç´ ã
*è¿åçå表è¿ä»£å¨æ¯fail-fast ã
*/
public ListIterator listIterator(int index) {
if (index < 0 || index > size)
throw new IndexOutOfBoundsException("Index: "+index);
return new ListItr(index);
}
/**
*è¿åå表ä¸çå表è¿ä»£å¨ï¼æéå½ç顺åºï¼ã
*è¿åçå表è¿ä»£å¨æ¯fail-fast ã
*/
public ListIterator listIterator() {
return new ListItr(0);
}
/**
*以æ£ç¡®ç顺åºè¿å该å表ä¸çå
ç´ çè¿ä»£å¨ã
*è¿åçè¿ä»£å¨æ¯fail-fast ã
*/
public Iterator iterator() {
return new Itr();
}
```
## 3. ArrayList æ©å®¹æºå¶åæ
### 3.1. å
ä» ArrayList çæé 彿°è¯´èµ·
**ï¼JDK8ï¼ArrayList æä¸ç§æ¹å¼æ¥åå§åï¼æé æ¹æ³æºç å¦ä¸ï¼**
```java
/**
* é»è®¤åå§å®¹é大å°
*/
private static final int DEFAULT_CAPACITY = 10;
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
/**
*é»è®¤æé 彿°ï¼ä½¿ç¨åå§å®¹é10æé ä¸ä¸ªç©ºå表(æ åæ°æé )
*/
public ArrayList() {
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}
/**
* 带åå§å®¹éåæ°çæé 彿°ãï¼ç¨æ·èªå·±æå®å®¹éï¼
*/
public ArrayList(int initialCapacity) {
if (initialCapacity > 0) {//åå§å®¹é大äº0
//å建initialCapacity大å°çæ°ç»
this.elementData = new Object[initialCapacity];
} else if (initialCapacity == 0) {//åå§å®¹éçäº0
//å建空æ°ç»
this.elementData = EMPTY_ELEMENTDATA;
} else {//åå§å®¹éå°äº0ï¼æåºå¼å¸¸
throw new IllegalArgumentException("Illegal Capacity: "+
initialCapacity);
}
}
/**
*æé å
嫿å®collectionå
ç´ çå表ï¼è¿äºå
ç´ å©ç¨è¯¥éåçè¿ä»£å¨æé¡ºåºè¿å
*妿æå®çéå为nullï¼throws NullPointerExceptionã
*/
public ArrayList(Collection extends E> c) {
elementData = c.toArray();
if ((size = elementData.length) != 0) {
// c.toArray might (incorrectly) not return Object[] (see 6260652)
if (elementData.getClass() != Object[].class)
elementData = Arrays.copyOf(elementData, size, Object[].class);
} else {
// replace with empty array.
this.elementData = EMPTY_ELEMENTDATA;
}
}
```
ç»å¿çåå¦ä¸å®ä¼åç° ï¼**以æ åæ°æé æ¹æ³å建 `ArrayList` æ¶ï¼å®é
ä¸åå§åèµå¼çæ¯ä¸ä¸ªç©ºæ°ç»ãå½çæ£å¯¹æ°ç»è¿è¡æ·»å å
ç´ æä½æ¶ï¼æçæ£åé
容éãå³åæ°ç»ä¸æ·»å 第ä¸ä¸ªå
ç´ æ¶ï¼æ°ç»å®¹éæ©ä¸º 10ã** ä¸é¢å¨æä»¬åæ ArrayList æ©å®¹æ¶ä¼è®²å°è¿ä¸ç¹å
容ï¼
> è¡¥å
ï¼JDK6 new æ åæé ç `ArrayList` 对象æ¶ï¼ç´æ¥å建äºé¿åº¦æ¯ 10 ç `Object[]` æ°ç» elementData ã
### 3.2. 䏿¥ä¸æ¥åæ ArrayList æ©å®¹æºå¶
è¿é以æ åæé 彿°å建ç ArrayList 为ä¾åæ
#### 3.2.1. å
æ¥ç `add` æ¹æ³
```java
/**
* å°æå®çå
ç´ è¿½å å°æ¤åè¡¨çæ«å°¾ã
*/
public boolean add(E e) {
//æ·»å å
ç´ ä¹åï¼å
è°ç¨ensureCapacityInternalæ¹æ³
ensureCapacityInternal(size + 1); // Increments modCount!!
//è¿éçå°ArrayListæ·»å å
ç´ çå®è´¨å°±ç¸å½äºä¸ºæ°ç»èµå¼
elementData[size++] = e;
return true;
}
```
> **注æ** ï¼JDK11 ç§»é¤äº `ensureCapacityInternal()` å `ensureExplicitCapacity()` æ¹æ³
#### 3.2.2. 忥çç `ensureCapacityInternal()` æ¹æ³
ï¼JDK7ï¼å¯ä»¥çå° `add` æ¹æ³ é¦å
è°ç¨äº`ensureCapacityInternal(size + 1)`
```java
//å¾å°æå°æ©å®¹é
private void ensureCapacityInternal(int minCapacity) {
if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
// è·åé»è®¤ç容éåä¼ å
¥åæ°çè¾å¤§å¼
minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
}
ensureExplicitCapacity(minCapacity);
}
```
**å½ è¦ add è¿ç¬¬ 1 个å
ç´ æ¶ï¼minCapacity 为 1ï¼å¨ Math.max()æ¹æ³æ¯è¾åï¼minCapacity 为 10ã**
> æ¤å¤ååç» JDK8 ä»£ç æ ¼å¼åç¥æä¸åï¼æ ¸å¿ä»£ç åºæ¬ä¸æ ·ã
#### 3.2.3. `ensureExplicitCapacity()` æ¹æ³
妿è°ç¨ `ensureCapacityInternal()` æ¹æ³å°±ä¸å®ä¼è¿å
¥ï¼æ§è¡ï¼è¿ä¸ªæ¹æ³ï¼ä¸é¢æä»¬æ¥ç ç©¶ä¸ä¸è¿ä¸ªæ¹æ³çæºç ï¼
```java
//夿æ¯å¦éè¦æ©å®¹
private void ensureExplicitCapacity(int minCapacity) {
modCount++;
// overflow-conscious code
if (minCapacity - elementData.length > 0)
//è°ç¨growæ¹æ³è¿è¡æ©å®¹ï¼è°ç¨æ¤æ¹æ³ä»£è¡¨å·²ç»å¼å§æ©å®¹äº
grow(minCapacity);
}
```
æä»¬æ¥ä»ç»åæä¸ä¸ï¼
- å½æä»¬è¦ add è¿ç¬¬ 1 个å
ç´ å° ArrayList æ¶ï¼elementData.length 为 0 ï¼å ä¸ºè¿æ¯ä¸ä¸ªç©ºç listï¼ï¼å 为æ§è¡äº `ensureCapacityInternal()` æ¹æ³ ï¼æä»¥ minCapacity æ¤æ¶ä¸º 10ãæ¤æ¶ï¼`minCapacity - elementData.length > 0`æç«ï¼æä»¥ä¼è¿å
¥ `grow(minCapacity)` æ¹æ³ã
- å½ add 第 2 个å
ç´ æ¶ï¼minCapacity 为 2ï¼æ¤æ¶ e lementData.length(容é)卿·»å 第ä¸ä¸ªå
ç´ åæ©å®¹æ 10 äºãæ¤æ¶ï¼`minCapacity - elementData.length > 0` 䏿ç«ï¼æä»¥ä¸ä¼è¿å
¥ ï¼æ§è¡ï¼`grow(minCapacity)` æ¹æ³ã
- æ·»å 第 3ã4···å°ç¬¬ 10 个å
ç´ æ¶ï¼ä¾ç¶ä¸ä¼æ§è¡ grow æ¹æ³ï¼æ°ç»å®¹éé½ä¸º 10ã
ç´å°æ·»å 第 11 个å
ç´ ï¼minCapacity(为 11)æ¯ elementData.lengthï¼ä¸º 10ï¼è¦å¤§ãè¿å
¥ grow æ¹æ³è¿è¡æ©å®¹ã
#### 3.2.4. `grow()` æ¹æ³
```java
/**
* è¦åé
çæå¤§æ°ç»å¤§å°
*/
private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
/**
* ArrayListæ©å®¹çæ ¸å¿æ¹æ³ã
*/
private void grow(int minCapacity) {
// oldCapacity为æ§å®¹éï¼newCapacity为æ°å®¹é
int oldCapacity = elementData.length;
//å°oldCapacity å³ç§»ä¸ä½ï¼å
¶ææç¸å½äºoldCapacity /2ï¼
//æä»¬ç¥éä½è¿ç®çé度è¿è¿å¿«äºæ´é¤è¿ç®ï¼æ´å¥è¿ç®å¼çç»æå°±æ¯å°æ°å®¹éæ´æ°ä¸ºæ§å®¹éç1.5åï¼
int newCapacity = oldCapacity + (oldCapacity >> 1);
//ç¶åæ£æ¥æ°å®¹éæ¯å¦å¤§äºæå°éè¦å®¹éï¼è¥è¿æ¯å°äºæå°éè¦å®¹éï¼é£ä¹å°±ææå°éè¦å®¹éå½ä½æ°ç»çæ°å®¹éï¼
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
// 妿æ°å®¹éå¤§äº MAX_ARRAY_SIZE,è¿å
¥(æ§è¡) `hugeCapacity()` æ¹æ³æ¥æ¯è¾ minCapacity å MAX_ARRAY_SIZEï¼
//妿minCapacityå¤§äºæå¤§å®¹éï¼åæ°å®¹éå为`Integer.MAX_VALUE`ï¼å¦åï¼æ°å®¹é大å°å为 MAX_ARRAY_SIZE å³ä¸º `Integer.MAX_VALUE - 8`ã
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);
}
```
**int newCapacity = oldCapacity + (oldCapacity >> 1),æä»¥ ArrayList æ¯æ¬¡æ©å®¹ä¹å容éé½ä¼åä¸ºåæ¥ç 1.5 åå·¦å³ï¼oldCapacity ä¸ºå¶æ°å°±æ¯ 1.5 åï¼å¦åæ¯ 1.5 åå·¦å³ï¼ï¼** å¥å¶ä¸åï¼æ¯å¦ ï¼10+10/2 = 15, 33+33/2=49ã妿æ¯å¥æ°çè¯ä¼ä¸¢æå°æ°.
> ">>"ï¼ç§»ä½è¿ç®ç¬¦ï¼ï¼>>1 å³ç§»ä¸ä½ç¸å½äºé¤ 2ï¼å³ç§» n ä½ç¸å½äºé¤ä»¥ 2 ç n 次æ¹ãè¿é oldCapacity ææ¾å³ç§»äº 1 使以ç¸å½äº oldCapacity /2ã对äºå¤§æ°æ®ç 2 è¿å¶è¿ç®,ä½ç§»è¿ç®ç¬¦æ¯é£äºæ®éè¿ç®ç¬¦çè¿ç®è¦å¿«å¾å¤,å 为ç¨åºä»
ä»
ç§»å¨ä¸ä¸èå·²,ä¸å»è®¡ç®,è¿æ ·æé«äºæç,èçäºèµæº
**æä»¬åæ¥éè¿ä¾åæ¢ç©¶ä¸ä¸`grow()` æ¹æ³ ï¼**
- å½ add 第 1 个å
ç´ æ¶ï¼oldCapacity 为 0ï¼ç»æ¯è¾å第ä¸ä¸ª if 夿æç«ï¼newCapacity = minCapacity(为 10)ã使¯ç¬¬äºä¸ª if 夿ä¸ä¼æç«ï¼å³ newCapacity 䏿¯ MAX_ARRAY_SIZE 大ï¼åä¸ä¼è¿å
¥ `hugeCapacity` æ¹æ³ãæ°ç»å®¹é为 10ï¼add æ¹æ³ä¸ return true,size å¢ä¸º 1ã
- å½ add 第 11 个å
ç´ è¿å
¥ grow æ¹æ³æ¶ï¼newCapacity 为 15ï¼æ¯ minCapacityï¼ä¸º 11ï¼å¤§ï¼ç¬¬ä¸ä¸ª if 夿䏿ç«ãæ°å®¹é没æå¤§äºæ°ç»æå¤§ sizeï¼ä¸ä¼è¿å
¥ hugeCapacity æ¹æ³ãæ°ç»å®¹éæ©ä¸º 15ï¼add æ¹æ³ä¸ return true,size å¢ä¸º 11ã
- 以æ¤ç±»æ¨Â·Â·Â·Â·Â·Â·
**è¿éè¡¥å
ä¸ç¹æ¯è¾éè¦ï¼ä½æ¯å®¹æè¢«å¿½è§æçç¥è¯ç¹ï¼**
- java ä¸ç `length`屿§æ¯é对æ°ç»è¯´ç,æ¯å¦è¯´ä½ 声æäºä¸ä¸ªæ°ç»,æ³ç¥éè¿ä¸ªæ°ç»çé¿åº¦åç¨å°äº length è¿ä¸ªå±æ§.
- java ä¸ç `length()` æ¹æ³æ¯é对å符串说ç,妿æ³çè¿ä¸ªå符串çé¿åº¦åç¨å° `length()` è¿ä¸ªæ¹æ³.
- java ä¸ç `size()` æ¹æ³æ¯é对æ³åéå说ç,妿æ³çè¿ä¸ªæ³åæå¤å°ä¸ªå
ç´ ,å°±è°ç¨æ¤æ¹æ³æ¥æ¥ç!
#### 3.2.5. `hugeCapacity()` æ¹æ³ã
ä»ä¸é¢ `grow()` æ¹æ³æºç æä»¬ç¥éï¼ å¦ææ°å®¹éå¤§äº MAX_ARRAY_SIZE,è¿å
¥(æ§è¡) `hugeCapacity()` æ¹æ³æ¥æ¯è¾ minCapacity å MAX_ARRAY_SIZEï¼å¦æ minCapacity å¤§äºæå¤§å®¹éï¼åæ°å®¹éå为`Integer.MAX_VALUE`ï¼å¦åï¼æ°å®¹é大å°å为 MAX_ARRAY_SIZE å³ä¸º `Integer.MAX_VALUE - 8`ã
```java
private static int hugeCapacity(int minCapacity) {
if (minCapacity < 0) // overflow
throw new OutOfMemoryError();
//对minCapacityåMAX_ARRAY_SIZEè¿è¡æ¯è¾
//è¥minCapacity大ï¼å°Integer.MAX_VALUEä½ä¸ºæ°æ°ç»ç大å°
//è¥MAX_ARRAY_SIZE大ï¼å°MAX_ARRAY_SIZEä½ä¸ºæ°æ°ç»ç大å°
//MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
return (minCapacity > MAX_ARRAY_SIZE) ?
Integer.MAX_VALUE :
MAX_ARRAY_SIZE;
}
```
### 3.3. `System.arraycopy()` å `Arrays.copyOf()`æ¹æ³
é
读æºç çè¯ï¼æä»¬å°±ä¼åç° ArrayList ä¸å¤§éè°ç¨äºè¿ä¸¤ä¸ªæ¹æ³ãæ¯å¦ï¼æä»¬ä¸é¢è®²çæ©å®¹æä½ä»¥å`add(int index, E element)`ã`toArray()` çæ¹æ³ä¸é½ç¨å°äºè¯¥æ¹æ³ï¼
#### 3.3.1. `System.arraycopy()` æ¹æ³
æºç ï¼
```java
// æä»¬åç° arraycopy æ¯ä¸ä¸ª native æ¹æ³,æ¥ä¸æ¥æä»¬è§£éä¸ä¸åä¸ªåæ°çå
·ä½æä¹
/**
* å¤å¶æ°ç»
* @param src æºæ°ç»
* @param srcPos æºæ°ç»ä¸çèµ·å§ä½ç½®
* @param dest ç®æ æ°ç»
* @param destPos ç®æ æ°ç»ä¸çèµ·å§ä½ç½®
* @param length è¦å¤å¶çæ°ç»å
ç´ çæ°é
*/
public static native void arraycopy(Object src, int srcPos,
Object dest, int destPos,
int length);
```
åºæ¯ï¼
```java
/**
* 卿¤å表ä¸çæå®ä½ç½®æå
¥æå®çå
ç´ ã
*å
è°ç¨ rangeCheckForAdd 对indexè¿è¡ç鿣æ¥ï¼ç¶åè°ç¨ ensureCapacityInternal æ¹æ³ä¿è¯capacityè¶³å¤å¤§ï¼
*åå°ä»indexå¼å§ä¹åçæææååç§»ä¸ä¸ªä½ç½®ï¼å°elementæå
¥indexä½ç½®ï¼æåsizeå 1ã
*/
public void add(int index, E element) {
rangeCheckForAdd(index);
ensureCapacityInternal(size + 1); // Increments modCount!!
//arraycopy()æ¹æ³å®ç°æ°ç»èªå·±å¤å¶èªå·±
//elementData:æºæ°ç»;index:æºæ°ç»ä¸çèµ·å§ä½ç½®;elementDataï¼ç®æ æ°ç»ï¼index + 1ï¼ç®æ æ°ç»ä¸çèµ·å§ä½ç½®ï¼ size - indexï¼è¦å¤å¶çæ°ç»å
ç´ çæ°éï¼
System.arraycopy(elementData, index, elementData, index + 1, size - index);
elementData[index] = element;
size++;
}
```
æä»¬åä¸ä¸ªç®åçæ¹æ³æµè¯ä»¥ä¸ï¼
```java
public class ArraycopyTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] a = new int[10];
a[0] = 0;
a[1] = 1;
a[2] = 2;
a[3] = 3;
System.arraycopy(a, 2, a, 3, 3);
a[2]=99;
for (int i = 0; i < a.length; i++) {
System.out.print(a[i] + " ");
}
}
}
```
ç»æï¼
```
0 1 99 2 3 0 0 0 0 0
```
#### 3.3.2. `Arrays.copyOf()`æ¹æ³
æºç ï¼
```java
public static int[] copyOf(int[] original, int newLength) {
// ç³è¯·ä¸ä¸ªæ°çæ°ç»
int[] copy = new int[newLength];
// è°ç¨System.arraycopy,å°æºæ°ç»ä¸çæ°æ®è¿è¡æ·è´,å¹¶è¿åæ°çæ°ç»
System.arraycopy(original, 0, copy, 0,
Math.min(original.length, newLength));
return copy;
}
```
åºæ¯ï¼
```java
/**
以æ£ç¡®ç顺åºè¿åä¸ä¸ªå
嫿¤åè¡¨ä¸ææå
ç´ çæ°ç»ï¼ä»ç¬¬ä¸ä¸ªå°æåä¸ä¸ªå
ç´ ï¼; è¿åçæ°ç»çè¿è¡æ¶ç±»åæ¯æå®æ°ç»çè¿è¡æ¶ç±»åã
*/
public Object[] toArray() {
//elementDataï¼è¦å¤å¶çæ°ç»ï¼sizeï¼è¦å¤å¶çé¿åº¦
return Arrays.copyOf(elementData, size);
}
```
个人è§å¾ä½¿ç¨ `Arrays.copyOf()`æ¹æ³ä¸»è¦æ¯ä¸ºäºç»åææ°ç»æ©å®¹ï¼æµè¯ä»£ç å¦ä¸ï¼
```java
public class ArrayscopyOfTest {
public static void main(String[] args) {
int[] a = new int[3];
a[0] = 0;
a[1] = 1;
a[2] = 2;
int[] b = Arrays.copyOf(a, 10);
System.out.println("b.length"+b.length);
}
}
```
ç»æï¼
```
10
```
#### 3.3.3. 两è
èç³»ååºå«
**èç³»ï¼**
ç两è
æºä»£ç å¯ä»¥åç° `copyOf()`å
é¨å®é
è°ç¨äº `System.arraycopy()` æ¹æ³
**åºå«ï¼**
`arraycopy()` éè¦ç®æ æ°ç»ï¼å°åæ°ç»æ·è´å°ä½ èªå·±å®ä¹çæ°ç»éæè
åæ°ç»ï¼èä¸å¯ä»¥éæ©æ·è´çèµ·ç¹åé¿åº¦ä»¥åæ¾å
¥æ°æ°ç»ä¸çä½ç½® `copyOf()` æ¯ç³»ç»èªå¨å¨å
鍿°å»ºä¸ä¸ªæ°ç»ï¼å¹¶è¿å该æ°ç»ã
### 3.4. `ensureCapacity`æ¹æ³
ArrayList æºç 䏿ä¸ä¸ª `ensureCapacity` æ¹æ³ä¸ç¥é大家注æå°æ²¡æï¼è¿ä¸ªæ¹æ³ ArrayList å
鍿²¡æè¢«è°ç¨è¿ï¼æä»¥å¾æ¾ç¶æ¯æä¾ç»ç¨æ·è°ç¨çï¼é£ä¹è¿ä¸ªæ¹æ³æä»ä¹ä½ç¨å¢ï¼
```java
/**
妿å¿
è¦ï¼å¢å æ¤ ArrayList å®ä¾ç容éï¼ä»¥ç¡®ä¿å®è³å°å¯ä»¥å®¹çº³ç±minimum capacityåæ°æå®çå
ç´ æ°ã
*
* @param minCapacity æéçæå°å®¹é
*/
public void ensureCapacity(int minCapacity) {
int minExpand = (elementData != DEFAULTCAPACITY_EMPTY_ELEMENTDATA)
// any size if not default element table
? 0
// larger than default for default empty table. It's already
// supposed to be at default size.
: DEFAULT_CAPACITY;
if (minCapacity > minExpand) {
ensureExplicitCapacity(minCapacity);
}
}
```
**æå¥½å¨ add 大éå
ç´ ä¹åç¨ `ensureCapacity` æ¹æ³ï¼ä»¥åå°å¢ééæ°åé
çæ¬¡æ°**
æä»¬éè¿ä¸é¢ç代ç å®é
æµè¯ä»¥ä¸è¿ä¸ªæ¹æ³çææï¼
```java
public class EnsureCapacityTest {
public static void main(String[] args) {
ArrayList