/**
* 创建空的list
*/publicCopyOnWriteArrayList(){setArray(newObject[0]);}/**
* 指定集合作为参数的 构造器
*/publicCopyOnWriteArrayList(Collection<?extendsE> c){
Object[] elements;if(c.getClass()== CopyOnWriteArrayList.class)
elements =((CopyOnWriteArrayList<?>)c).getArray();else{
elements = c.toArray();// c.toArray might (incorrectly) not return Object[] (see 6260652)if(elements.getClass()!= Object[].class)
elements = Arrays.copyOf(elements, elements.length, Object[].class);}setArray(elements);}/**
* 指定数组为参数的构造器
*/publicCopyOnWriteArrayList(E[] toCopyIn){setArray(Arrays.copyOf(toCopyIn, toCopyIn.length, Object[].class));}
add()方法
/**
*在list尾部添加元素
*/publicbooleanadd(E e){final ReentrantLock lock =this.lock;//加锁
lock.lock();try{//获取底层数组
Object[] elements =getArray();//数组的长度int len = elements.length;//拷贝一个新的数组,长度为原数组长度加1
Object[] newElements = Arrays.copyOf(elements, len +1);//新数组最后一个位置存插入的元素e
newElements[len]= e;//修改数组引用setArray(newElements);//返回添加成功returntrue;}finally{//解锁
lock.unlock();}}
重载的add()方法
publicvoidadd(int index, E element){final ReentrantLock lock =this.lock;//加锁
lock.lock();try{
Object[] elements =getArray();int len = elements.length;if(index > len || index <0)thrownewIndexOutOfBoundsException("Index: "+index+", Size: "+len);
Object[] newElements;int numMoved = len - index;//如果是在list的末尾插入元素if(numMoved ==0)
newElements = Arrays.copyOf(elements, len +1);else{//如果不是在list的末尾插入元素
newElements =newObject[len +1];
System.arraycopy(elements,0, newElements,0, index);
System.arraycopy(elements, index, newElements, index +1,
numMoved);}
newElements[index]= element;setArray(newElements);}finally{//解锁
lock.unlock();}}
set()方法
public E set(int index, E element){final ReentrantLock lock =this.lock;//加锁
lock.lock();try{
Object[] elements =getArray();
E oldValue =get(elements, index);if(oldValue != element){int len = elements.length;//拷贝新的数组
Object[] newElements = Arrays.copyOf(elements, len);//更新index位置元素值
newElements[index]= element;setArray(newElements);}else{// Not quite a no-op; ensures volatile write semanticssetArray(elements);}return oldValue;}finally{//解锁
lock.unlock();}}
remove()方法
public E remove(int index){final ReentrantLock lock =this.lock;//加锁
lock.lock();try{
Object[] elements =getArray();int len = elements.length;
E oldValue =get(elements, index);int numMoved = len - index -1;//如果删除的是list最后一个元素if(numMoved ==0)setArray(Arrays.copyOf(elements, len -1));else{//如果删除的不是list最后一个元素
Object[] newElements =newObject[len -1];
System.arraycopy(elements,0, newElements,0, index);
System.arraycopy(elements, index +1, newElements, index,
numMoved);setArray(newElements);}return oldValue;}finally{//解锁
lock.unlock();}}