# ArrayList åæä»¥åç¸å
³æ¹æ³ä»ç»
## ArrayListç®ä»ï¼
**java.util.ArrayList** æ¯æä»¬æå¸¸ç¨çä¸ä¸ªç±»ï¼ArrayList åºå±æ¯å¨ææ°ç»ï¼è¯»è
å¯ä»¥æå®ç解为æ°ç»çå®ç°
```java
public class ArrayList extends AbstractList
implements List, RandomAccess, Cloneable, java.io.Serializable{
}
```
å¦ä¸ä»£ç æä»¬å¯ä»¥çå° ArrayList ç»§æ¿äº AbstractList() æ½è±¡ç±»ï¼å¹¶å®ç°äº List, RandomAccess, Cloneable, Serializable æ¥å£
#### AbstractList :
```java
public abstract class AbstractList extends AbstractCollection implements List {}
```
å¯ä»¥çå°AbstractList ç»§æ¿äº AbstractCollection æ¥å£, å¹¶å®ç°äºList æ¥å£
#### AbstractCollection :
```java
public abstract class AbstractCollection implements Collection {}
```
AbstractCollection æ¯ä¸ä¸ªæ½è±¡ç±»ï¼å®ç°äºCollection æ¥å£ï¼å¹¶æä¾äºæäºæ¹æ³çå
·ä½å®ç°ã
#### Collectionï¼
Collection æ¯ä¸ä¸ªé¡¶çº§æ¥å£ï¼æ¯å¾å¤éåç±»ç顶级æ¥å£ï¼ç»§æ¿äºIterable ï¼æ¯æè½»é级éåå
¶ä¸å
ç´
```java
public interface Collection extends Iterable {}
```
#### List :
ArrayList å®ç°äºListæ¥å£ï¼List 乿¯ä¸ä¸ªåCollection 媲ç¾ç顶级æ¥å£ï¼ç»§æ¿äºCollection æ¥å£
```java
public interface List extends Collection {}
```
宿¯è®¸å¤éåç±»çç¶ç±»,
eg:
```java
List list = new ArrayList();
List list2 = new LinkedList();
```
#### RandomAccess
RandomAccess 乿¯ä¸ä¸ªé¡¶çº§æ¥å£ï¼å®ç°äºæ¤æ¥å£çç±»æ¯æéæºè®¿é®
#### Cloneable
Cloneable æ¥å£æ¯ä¸ä¸ªé¡¶çº§æ¥å£ï¼å®ç°äºæ¤æ¥å£çç±»æ¯ææµ
æ·è´
#### Serializable
å®ç°æ¤æ¥å£çç±»æ¯æåºååçåè½
**ç±»ä¹é´çç»§æ¿å
³ç³»å¦å¾**

## ArrayList ç¸å
³æ¹æ³ä»ç»


trimToSize()

### 代ç 表示
å®è·µææ¯æ£éªççæå¥½çæ¹å¼ï¼
```java
import java.util.*;
/**
* 详述ArrayList åºæ¬ç¨æ³
*/
public class ArrayListTest {
private static class SortList implements Comparator {
@Override
public int compare(String o1, String o2) {
Integer i1 = Integer.valueOf(o1);
Integer i2 = Integer.valueOf(o2);
if(i1 < i2){
return -1;
}else if(i1 == i2){
return 0;
}
return 1;
}
}
// 使ç¨å¯ååæ°ï¼è½å¤æ¥åä»»æä¸ªåæ°
public Set putSet(String...args){
Set sets = new HashSet<>();
for(String str : args){
sets.add(str);
}
return sets;
}
public static void main(String[] args) {
ArrayList list = new ArrayList<>();
list.add("111");
list.add("222");
// 卿å®ä½ç½®æ·»å å
ç´
list.add(0,"333");
System.out.println(list);
// è¿è¡å¤é¨æåº
list.sort(new SortList());
System.out.println(list);
list.clear();
System.out.println(list.size());
// 使ç¨addAllæ·»å å
ç´
ArrayListTest at = new ArrayListTest();
list.addAll(at.putSet("1","2","3"));
Iterator it = list.iterator();
while(it.hasNext()){
System.out.println(it.next());
// ç§»é¤ææå
ç´
it.remove();
}
System.out.println("listæ¯å¦ä¸ºç©º ? " + list.isEmpty());
list.add("111");
// 卿å®ä½ç½®æ·»å ä¸ä¸ªsetéå
list.addAll(0,at.putSet("1","2","3"));
System.out.println(list);
// æ¯å¦å
嫿å®å
ç´
if(list.contains("111")) {
list.remove("111");
}
System.out.println(list);
System.out.println(list.indexOf("1"));
// 注æsubList()è¿ä¸ªæ¹æ³æ¯å·¦å¼å³éåºé´ï¼Java ä¸å¾å¤é½æ¯ç±»ä¼¼ç
System.out.println(list.subList(0,3));
// æ©å¤§listç容é
list.ensureCapacity(10);
// 廿list空é²ç容é
list.trimToSize();
// è·åæä¸ªç¹å®çå
ç´
System.out.println(list.get(1));
// å建ä¸ä¸ªlistçååé¾è¡¨
ListIterator listIterator = list.listIterator();
while(listIterator.hasNext()){
// ç§»å°listçæ«ç«¯
System.out.println(listIterator.next());
}
System.out.println("--------------------------");
while (listIterator.hasPrevious()){
// ç§»å°listçé¦ç«¯
System.out.println(listIterator.previous());
}
// ælist转æ¢ä¸ºæ°ç»
Object[] objects = list.toArray();
System.out.println("objects = " + objects);
}
}
```
### ç¸å
³æ¹æ³æºç åæ
**æºç çå
·ä½åææ¯æ ¹æ®ä¸é¢ç代ç 示ä¾å¾åºï¼å 为åªçæºç 好åå¹¶ä¸è½çæä»ä¹ï¼éè¦æ ¹æ®å
·ä½ç代ç 䏿¥ä¸æ¥debug è¿è¡è·è¸ª**
**add()æ¹æ³**
è§£éï¼æ·»å æå®çå
ç´ å¨listçæ«å°¾
```java
/**
* æ·»å æå®çå
ç´ å¨listçæ«å°¾
*/
// åè®¾ç¬¬ä¸æ¬¡æ·»å çæ¯ "111"
public boolean add(E e) {
// sizeæ¯0ï¼æä»¥size + 1 ä¼ çæ¯1
ensureCapacityInternal(size + 1);
// elementData[0] = 111 , size++ = 1
elementData[size++] = e;
return true;
}
// æ¤æ¹æ³ç¨æ¥è¿è¡list æ©å®¹
private void ensureCapacityInternal(int minCapacity) {
// æ¤æ¶elementData 并没æåå¨å
ç´ ï¼ä¸º0
if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
// åminCapacity åé»è®¤åå§å®¹éåminCapacity çæå¤§å¼ (å1 å 10çæå¤§å¼)
minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
}
// ç¡®ä¿æ¸
æ°ç容é(æå°å®¹éä¸Listå
ç´ çæ¯è¾)
ensureExplicitCapacity(minCapacity);
}
// å¨list䏿·»å äºä¸ä¸ªå
ç´ ï¼æä»¥ä¼å¯¼è´ç»æåçä¿®æ¹ï¼"ç»æåçä¿®æ¹"è§ä¸é¢è§£é
// æ¤æ¶minCapacity 为 10
private void ensureExplicitCapacity(int minCapacity) {
// æ¬¡æ° + 1
// è¿ä¸ªå表被修æ¹ç»æç次æ°(æ¯å¦æ·»å åå é¤å
ç´ )ä¼ç¨modCount表示. ç»æåä¿®æ¹æ¯æçæ¯è½å¤
// æ¹åå表容éçæä½ï¼æè
å
¶ä»æ¹å¼æ¹åå®ï¼å¯¼è´éåçè¿ç¨ä¼äº§çé误çç»æã
modCount++;
// overflow-conscious code
// 10 - 0 > 0 èµ°grow æ¹æ³
if (minCapacity - elementData.length > 0)
grow(minCapacity);
}
/**
* å¢å 容éç¡®ä¿å®¹çº³è¶³å¤çå
ç´
*
* åæ°ä¼ è¿æ¥çæ¯10
*/
private void grow(int minCapacity) {
// overflow-conscious code
// oldCapacity = 0
int oldCapacity = elementData.length;
// newCapacity = 0
int newCapacity = oldCapacity + (oldCapacity >> 1);
// newCapacity - minCapacity = -10
if (newCapacity - minCapacity < 0)
// newCapacity = 10
newCapacity = minCapacity;
// MAX_ARRAY_SIZE = æ°ç»åé
çæå¤§ç©ºé´ = 2147483639
// ä¸è¬æ
åµä¸ä¸ä¼æ¯ MAX_ARRAY_SIZE è¿è¦å¤§
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
// minCapacity is usually close to size, so this is a win:
// åºå±è¿æ¯ç¨çSystem.arraycopy(), å
³äºSystem.arrayCopy() 读è
å¯ä»¥åèæçå¦ä¸ç¯å客
elementData = Arrays.copyOf(elementData, newCapacity);
}
```
ç¸å
³å¸¸ç¨çåºæ¬æ°æ®ç±»åå
è£
ç±»çå¼ï¼ Javaåºæ¬æ°æ®ç±»åå
è£
类常ç¨çå¼
**add(int index, E element)**
è§£éï¼å¨list䏿å®ä½ç½®æå
¥æå®çå
ç´ ï¼å¦æå½åä½ç½®æå
ç´ ï¼å°±ç§»å¨å½åä½ç½®çå
ç´
```java
/**
* å¨list䏿å®ä½ç½®æå
¥æå®çå
ç´ ï¼å¦æå½åä½ç½®æå
ç´ ï¼å°±ç§»å¨å½åä½ç½®çå
ç´
* è¦æå
¥çä½ç½®çå颿æå
ç´ çä½ç½®åå + 1
*
*/
public void add(int index, E element) {
// æ£æ¥ 0 è¿ä¸ªä½ç½®æ¯å¦è¶ç
rangeCheckForAdd(index);
// ä¸åèµè¿°ï¼è¯»è
å¯ä»¥èªè¡debug
ensureCapacityInternal(size + 1); // Increments modCount!!
// å 为ä»å½åä½ç½®æå
¥å
ç´ ï¼æä»¥å½åä½ç½®ååé¢çå
ç´ é½ä¼ååç§»å¨
// 使ç¨System.arraycopy è¿è¡æ°ç»å¤å¶
System.arraycopy(elementData, index, elementData, index + 1,
size - index);
// 为å½åå
ç´ èµå¼
elementData[index] = element;
size++;
}
/**
* 为add å addall æä¾çèå´æ£æ¥, ä¸ç¬¦åæ¡ä»¶ï¼æåºIndexOutOfBoundsException å¼å¸¸
*/
private void rangeCheckForAdd(int index) {
if (index > size || index < 0)
throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
}
```
**Clear()**
è§£éï¼ç§»é¤å表ä¸çææå
ç´
```java
/**
* ç§»é¤liståè¡¨ä¸ææçå
ç´ ï¼å表ä¼å为空å表å¨è°ç¨æ¤æ¹æ³å
*
*/
public void clear() {
// ä¿®æ¹æ¬¡æ° + 1
modCount++;
// clear to let GC do its work
// ææ¯ä¸ªåé置空ï¼GCè¿è¡åæ¶
for (int i = 0; i < size; i++)
elementData[i] = null;
// å表çé¿åº¦å为0
size = 0;
}
```
è¿ä¸ªæ¹æ³çæºç ç解起æ¥è¿æ¯æ¯è¾ç®åç
**addAll(Collection extends E> c)**
è§£éï¼ æä¸ä¸ªCollectionéåæ·»å å°listæ«å°¾
```java
/**
* æä¸ä¸ªCollectionéå(å®ç°äºæ¤æ¥å£çç±»)æ·»å å°listçæ«å°¾ï¼æçè¿ä»£ç顺åºè¿åã
* æ¤æä½çè¡ä¸ºæ¯å¦æå¨æ¤æ¹æ³è°ç¨çè¿ç¨ä¸ä¿®æ¹äºCollection(å®ç°äºæ¤æ¥å£çç±»)çè¯ï¼
* é£ä¹è¿ä¸ªæä½ä¸ä¼æå
*/
public boolean addAll(Collection extends E> c) {
// æCollection 转æ¢ä¸º Object[] æ°ç»
Object[] a = c.toArray();
// æ°ç»ä¸æä¸ä¸ªå
ç´
int numNew = a.length;
// å 为ä¸é¢çæä½è°ç¨äºä¸æ¬¡list.clear()æ¹æ³ï¼æä»¥list.size = 0
ensureCapacityInternal(size + numNew); // Increments modCount
// ä¸å¥è¯è§£éï¼ æa æ°ç»ä¸0个ä½ç½®çå
ç´ å¤å¶å° elementDataæ°ç»ä¸ 第size个ä½ç½®çå
ç´ ï¼
// å¤å¶çé¿åº¦ä¸º numNew
System.arraycopy(a, 0, elementData, size, numNew);
size += numNew;
return numNew != 0;
}
// toArray()æ¹æ³ï¼
/**
* è¿åä¸ä¸ªæ°ç»ï¼å
å«äºææçå
ç´ (ä»ç¬¬ä¸ä¸ªå
ç´ å°æåä¸ä¸ªå
ç´ )
* è¿åçæ°ç»æ¯å¾"å®å
¨ç"å 为å表没æå¼ç¨å¯ä»¥ç»´æ(æ¢å¥è¯è¯´ï¼è¿ä¸ªæ¹æ³å¿
é¡»åé
ä¸ä¸ªæ°æ°ç»)
* è°ç¨è
å æ¤å¯ä»¥ä»»æä¿®æ¹è¿åçæ°ç»
* è¿ä¸ªæ¹æ³æ¯æ°ç» å éåä¹é´çæ¡¥æ¢
*/
public Object[] toArray() {
return Arrays.copyOf(elementData, size);
}
```
**iterator(), hasNext(), next()**
è§£éï¼Iteratoræ¹æ³ç¨äºéålistä¸çå
ç´ ï¼è¿åä¸ä¸ªItr çå
é¨ç±»ï¼hasNext()æ¹æ³ç¨äºå¤ælist 䏿¯å¦è¿ææªéåçå
ç´ ï¼next()æ¹æ³ç¨äºè·åä¸ä¸ä¸ªå
ç´
```java
/**
* 以éå½ç顺åºè¿åæ¤å表ä¸å
ç´ çè¿ä»£å¨
* è¿åçiterator æ¯æfail-fast æºå¶
*/
public Iterator iterator() {
return new Itr();
}
/**
* Itr æ¯ä¸ä¸ªå
é¨ç±»ï¼å®ç°äºIteratoræ¥å£ï¼å¯æ¯æå¿«ééå
*/
private class Itr implements Iterator {
// ä¸ä¸ä¸ªå
ç´ è¿åç䏿
int cursor; // index of next element to return
// æåä¸ä¸ªå
ç´ è¿åç䏿 ï¼ å¦ææ²¡æè¿å-1
int lastRet = -1; // index of last element returned; -1 if no such
// expectedModCount ææçä¿®æ¹æ¬¡æ°ï¼é»è®¤æ¯åmodCount(ä¿®æ¹æ¬¡æ°ç¸åï¼ç¨äºiterator夿fail-fastæºå¶)
int expectedModCount = modCount;
public boolean hasNext() {
return cursor != size;
}
@SuppressWarnings("unchecked")
public E next() {
// 夿éåçè¿ç¨ä¸æ¯å¦è§¦åfail-fastæºå¶
checkForComodification();
int i = cursor;
if (i >= size)
throw new NoSuchElementException();
Object[] elementData = ArrayList.this.elementData;
if (i >= elementData.length)
throw new ConcurrentModificationException();
cursor = i + 1;
return (E) elementData[lastRet = i];
}
public void remove() {
// 妿lastRet < 0ï¼è¯´æ lastRet 没æè¢«æ¹åï¼
// æä»¥åºè¯¥æ¯æ²¡æè°ç¨next()å°±è°ç¨äºremove()
if (lastRet < 0)
throw new IllegalStateException();
checkForComodification();
try {
ArrayList.this.remove(lastRet);
cursor = lastRet;
lastRet = -1;
expectedModCount = modCount;
} catch (IndexOutOfBoundsException ex) {
throw new ConcurrentModificationException();
}
}
@Override
@SuppressWarnings("unchecked")
public void forEachRemaining(Consumer super E> consumer) {
Objects.requireNonNull(consumer);
final int size = ArrayList.this.size;
int i = cursor;
if (i >= size) {
return;
}
final Object[] elementData = ArrayList.this.elementData;
if (i >= elementData.length) {
throw new ConcurrentModificationException();
}
while (i != size && modCount == expectedModCount) {
consumer.accept((E) elementData[i++]);
}
cursor = i;
lastRet = i - 1;
checkForComodification();
}
// å¦æä¿®æ¹æ¬¡æ°ä¸æ»¡è¶³é¢æä¿®æ¹æ¬¡æ°çè¯ï¼æåºå¼å¸¸
final void checkForComodification() {
if (modCount != expectedModCount)
throw new ConcurrentModificationException();
}
}
```
**addAll(int index,Collection extends E> c)**
è§£éï¼å¨æä¸ªä½ç½®æ·»å Collectionéå
```java
/**
* 卿å®çä½ç½®ä¸æ æå
¥ä¸ä¸ªCollectionéå
*/
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)
// ç¬¬ä¸æ¬¡æ°ç»å¤å¶ï¼ä»elementDataä¸çindexä½ç½®å¼å§ï¼å¤å¶å°index + numNewä½ç½®ä¸ï¼å¤å¶numMoved个å
ç´
System.arraycopy(elementData, index, elementData, index + numNew,
numMoved);
// ç¬¬äºæ¬¡æ°ç»å¤å¶,ä»a æ°ç»ä¸ç第0个ä½ç½®å¼å§ï¼å¤å¶å°elementData第indexä½ç½®ä¸ä½ ï¼å¤å¶numNew个å
ç´
System.arraycopy(a, 0, elementData, index, numNew);
size += numNew;
return numNew != 0;
}
```
**contains(Object o)**
è§£éï¼å¤ælistå表æ¯å¦å
å«æä¸ªå
ç´
```java
/**
* è¿åtrueï¼å¦æè¿ä¸ªå表å
嫿å®çå
ç´
* æ´è¿ä¸æ¥æ¥è¯´ï¼å½ä¸ä»
å½listå
å«è³å°ä¸ä¸ªå
ç´ çæ
åµä¸ï¼è¿åtrue
*/
public boolean contains(Object o) {
return indexOf(o) >= 0;
}
/**
* è¿åå表ä¸ç¬¬ä¸æ¬¡åºç°æå®å
ç´ ç䏿 å¼ï¼å¦æä¸å
嫿å®å
ç´ ï¼åè¿å-1ã
* æ´è¿ä¸æ¥æ¥è¯´ï¼è¿åæå°çç´¢å¼å½(o == null ? get(i) == null : o.equals(get(i)))çæ¶å
* æè
è¿å-1 æ²¡ææ¤ä¸æ å¼
*
*/
public int indexOf(Object o) {
// 妿oè¿ä¸ªå¯¹è±¡çäºnullï¼å°±å¤æelementData䏿¯å¦æç©ºå
ç´ ï¼å¦ææï¼è¿å
if (o == null) {
for (int i = 0; i < size; i++)
if (elementData[i]==null)
return i;
} else {
// 妿ä¸ä¸ºnullï¼è¿åè¿ä¸ªå¼çåå¨ä½ç½®
for (int i = 0; i < size; i++)
if (o.equals(elementData[i]))
return i;
}
return -1;
}
```
**remove(Object o)**
è§£éï¼ç§»é¤listä¸çæä¸ªå
ç´
```java
/**
* 妿åå¨ï¼åç§»é¤listä¸æä¸ªç¬¬ä¸æ¬¡åºç°çå
ç´ ã妿è¿ä¸ªlistä¸å
嫿å®å
ç´ ï¼å°±ä¸ä¼æ¹å
*
*/
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 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
}
```
**indexOf(Object o)**
è§£éï¼æ£ç´¢æä¸ªå
ç´ çä½ç½®
æ¤æºç åcontains(Object o)ä¸è°ç¨çindexOf æºç ç¸å
**subList(int fromIndex, int toIndex)**
è§£éï¼è¿ålistå表çä¸ä¸ªç段
```java
/**
* è¿ålistå表ä¸çä¸é¨åè§å¾(ç¸å½äºlistçæ®µ),[fromIndex,toIndex)ï¼å¦æfromIndex å
* toIndex ç¸åçè¯ï¼è¡¨æè¿ä¸ªlist为空ï¼è¿ä¸ªè¿åçlist被è¿åï¼æä»¥å¨listä¸å¹¶æ²¡æç»æçæ¹å
* è¿ä¸ªè¿åçlistçæ®µæ¯æææçlistæä½
*/
public List subList(int fromIndex, int toIndex) {
// subList èå´æ£æ¥
subListRangeCheck(fromIndex, toIndex, size);
return new SubList(this, 0, fromIndex, toIndex);
}
static void subListRangeCheck(int fromIndex, int toIndex, int size) {
if (fromIndex < 0)
throw new IndexOutOfBoundsException("fromIndex = " + fromIndex);
if (toIndex > size)
throw new IndexOutOfBoundsException("toIndex = " + toIndex);
if (fromIndex > toIndex)
throw new IllegalArgumentException("fromIndex(" + fromIndex +
") > toIndex(" + toIndex + ")");
}
private class SubList extends AbstractList implements RandomAccess {
private final AbstractList parent;
private final int parentOffset;
private final int offset;
int size;
SubList(AbstractList parent,
int offset, int fromIndex, int toIndex) {
this.parent = parent;
this.parentOffset = fromIndex;
this.offset = offset + fromIndex;
this.size = toIndex - fromIndex;
this.modCount = ArrayList.this.modCount;
}
}
```
**ensureCapacity(int minCapacity)**
è§£éï¼æ©å¤§listç容é
```java
/**
* å¢å ArrayListå®ä¾ç容éï¼å¦æå¿
é¡»çè¯ï¼ç¡®ä¿å®è½æææå°å®¹éçå
ç´
*/
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);
}
}
```
**trimToSize()**
è§£éï¼å»ælist空é²ç容é
```java
/**
* 廿ArrayListä¸çå¤ä½ç©ºé´
*/
public void trimToSize() {
modCount++;
if (size < elementData.length) {
elementData = (size == 0)
? EMPTY_ELEMENTDATA
: Arrays.copyOf(elementData, size);
}
}
```
**sort(Comparator super E> c)**
sort æ¹æ³æ¥æ¶ä¸ä¸ªèªå®ä¹æ¯è¾å¨è¿è¡èªå®ä¹æ¯è¾ï¼ä¸é¢æ¥çå
·ä½çæºç
```java
@Override
@SuppressWarnings("unchecked")
public void sort(Comparator super E> c) {
// æ ¹æ®ä¸é¢ä»£ç åæï¼æ¤æ¶modCounnt å·²ç»è¢«ä¿®æ¹è¿ä¸æ¬¡(æ·»å äºä¸ä¸ªå
ç´ )
final int expectedModCount = modCount;
// æ°ç»å¤é¨æåº
Arrays.sort((E[]) elementData, 0, size, c);
if (modCount != expectedModCount) {
throw new ConcurrentModificationException();
}
modCount++;
}
```