### ä¸ãæ¦è¿°
> 以æ°ç»å®ç°ãè约空é´ï¼ä½æ°ç»æå®¹ééå¶ãè¶
åºéå¶æ¶ä¼å¢å 50%容éï¼ç¨System.arraycopy\(\)å¤å¶å°æ°çæ°ç»ï¼å æ¤æå¥½è½ç»åºæ°ç»å¤§å°çé¢ä¼°å¼ãé»è®¤ç¬¬ä¸æ¬¡æå
¥å
ç´ æ¶å建大å°ä¸º10çæ°ç»ã
>
> ææ°ç»ä¸æ 访é®å
ç´ âget\(i\)/set\(i,e\) çæ§è½å¾é«ï¼è¿æ¯æ°ç»çåºæ¬ä¼å¿ã
>
> ç´æ¥å¨æ°ç»æ«å°¾å å
¥å
ç´ âadd\(e\)çæ§è½ä¹é«ï¼ä½å¦ææä¸æ æå
¥ãå é¤å
ç´ âadd\(i,e\), remove\(i\), remove\(e\)ï¼åè¦ç¨System.arraycopy\(\)æ¥ç§»å¨é¨ååå½±åçå
ç´ ï¼æ§è½å°±åå·®äºï¼è¿æ¯åºæ¬å£å¿ã
ç¶å忥å¦ä¹ ä¸ä¸å®æ¹ææ¡£ï¼
> **Resizable-array**implementation of the List interface. Implements all optional list operations, and permits all elements, including null. In addition to implementing the List interface, this class provides methods to manipulate the size of the array that is used internally to store the list. \(This class is roughly equivalent to Vector, except that it is unsynchronized.\)
ArrayListæ¯ä¸ä¸ªç¸å¯¹æ¥è¯´æ¯è¾ç®åçæ°æ®ç»æï¼æéè¦çä¸ç¹å°±æ¯å®çèªå¨æ©å®¹ï¼å¯ä»¥è®¤ä¸ºå°±æ¯æä»¬å¸¸è¯´çâ卿æ°ç»âã
æ¥ç䏿®µç®åç代ç ï¼
```java
ArrayList list = new ArrayList();
list.add("è¯æ: 99");
list.add("æ°å¦: 98");
list.add("è±è¯: 100");
list.remove(0);
```
卿§è¡è¿åæ¡è¯å¥æ¶ï¼æ¯è¿ä¹ååçï¼

å
¶ä¸ï¼`add`æä½å¯ä»¥çè§£ä¸ºç´æ¥å°æ°ç»çå
容置ä½ï¼`remove`æä½å¯ä»¥ç解为å é¤index为0çèç¹ï¼å¹¶å°åé¢å
ç´ ç§»å°0å¤ã
### äºã add彿° {#2-_add彿°}
彿们å¨ArrayListä¸å¢å å
ç´ çæ¶åï¼ä¼ä½¿ç¨`add`彿°ãä»ä¼å°å
ç´ æ¾å°æ«å°¾ãå
·ä½å®ç°å¦ä¸ï¼
```java
public boolean add(E e) {
ensureCapacityInternal(size + 1); // Increments modCount!!
elementData[size++] = e;
return true;
}
```
æä»¬å¯ä»¥çå°ä»çå®ç°å
¶å®ææ ¸å¿çå
容就æ¯`ensureCapacityInternal`ãè¿ä¸ªå½æ°å
¶å®å°±æ¯**èªå¨æ©å®¹æºå¶çæ ¸å¿**ãæä»¬ä¾æ¬¡æ¥çä¸ä¸ä»çå
·ä½å®ç°
```java
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);
}
private void grow(int minCapacity) {
// overflow-conscious code
int oldCapacity = elementData.length;
// æ©å±ä¸ºåæ¥ç1.5å
int newCapacity = oldCapacity + (oldCapacity >> 1);
// 妿æ©ä¸º1.5åè¿ä¸æ»¡è¶³éæ±ï¼ç´æ¥æ©ä¸ºéæ±å¼
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);
}
```
ä¹å°±æ¯è¯´ï¼å½å¢å æ°æ®çæ¶åï¼å¦æArrayListç大å°å·²ç»ä¸æ»¡è¶³éæ±æ¶ï¼é£ä¹å°±å°æ°ç»å为åé¿åº¦ç1.5åï¼ä¹åçæä½å°±æ¯æèçæ°ç»æ·å°æ°çæ°ç»éé¢ãä¾å¦ï¼é»è®¤çæ°ç»å¤§å°æ¯10ï¼ä¹å°±æ¯è¯´å½æä»¬`add`10个å
ç´ ä¹åï¼åè¿è¡ä¸æ¬¡addæ¶ï¼å°±ä¼åçèªå¨æ©å®¹ï¼æ°ç»é¿åº¦ç±10å为äº15å
·ä½æ
åµå¦ä¸æç¤ºï¼

### ä¸ãsetåget彿° {#3_setåget彿°}
Arrayçsetåget彿°å°±æ¯è¾ç®åäºï¼å
åindexæ£æ¥ï¼ç¶åæ§è¡èµå¼æè®¿é®æä½ï¼
```java
public E set(int index, E element) {
rangeCheck(index);
E oldValue = elementData(index);
elementData[index] = element;
return oldValue;
}
public E get(int index) {
rangeCheck(index);
return elementData(index);
}
```
### åãremove彿° {#4_remove彿°}
```java
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);
// ææåçç½®null
elementData[--size] = null; // clear to let GC do its work
return oldValue;
}
```