private volatile transient Object[] array; final Object[] getArray() { return array; } final void setArray(Object[] a) { array = a; }
- CopyOnWriteArrayList():构造一个内容为空的对象
- CopyOnWriteArrayList(Collection<? extends E> c):根据传入参数中的内容,构造一个新的对象
- CopyOnWriteArrayList(E[] toCopyIn):根据传入数组中的内容,构造一个新的对象
public CopyOnWriteArrayList() { setArray(new Object[0]); } /** * 根据传入参数c的长度,构造一个同样长度的Object[]对象,并且将c的内容,依次填入此Object[]对象中
* 注意:
* 1. 这里对于c中内容的复制,是浅拷贝而非深拷贝
* 2. 这里的构造函数,未显式判断c是否为null,实际上如果c为null,会抛出空指针异常 */ public CopyOnWriteArrayList(Collection<? extends E> c) { Object[] elements = c.toArray(); if (elements.getClass() != Object[].class) elements = Arrays.copyOf(elements, elements.length, Object[].class); setArray(elements); } /** * 根据传入参数的长度,构造出一个同样长度,内容一致的数组对象,封装在CopyOnWriteArrayList中
* 注意:
* 1. 这里对于数组内容的复制,是浅拷贝而非深拷贝
* 2. 这里的构造函数,未显式判断传入参数是否为null,实际上如果传入参数为null,会抛出空指针异常 */ public CopyOnWriteArrayList(E[] toCopyIn) { setArray(Arrays.copyOf(toCopyIn, toCopyIn.length, Object[].class)); }
public E get(int index) { return (E)(getArray()[index]); }
public int indexOf(Object o) { /*
* 在取数组元素前,获取当前时刻array对象的引用至关重要
* 在后续文章描述中可以知道,CopyOnArrayList在set操作时,会更新array对象的引用
* 这里如果不事先获得引用,那么后面实际的indexOf操作,会因为并发问题,得到意想不到的结果,还可能出现数组越界异常