CopyOnWriteArrayList简介 定义 add(E e)方法 add(int index, E element)方法 set(int index, E element)方法 get(int index)方法 remove() 迭代 源码分析 参考
- CopyOnWriteArrayList,写数组的拷贝,支持高效率并发且是线程安全的,读操作无锁的ArrayList。所有可变操作都是通过对底层数组进行一次新的复制来实现。
- CopyOnWriteArrayList适合使用在读操作远远大于写操作的场景里,比如缓存。它不存在扩容的概念,每次写操作都要复制一个副本,在副本的基础上修改后改变Array引用。CopyOnWriteArrayList中写操作需要大面积复制数组,所以性能肯定很差
- 在迭代器上进行的元素更改操作(remove、set和add)不受支持。这些方法将抛出UnsupportedOperationException。
初始化时候新建一个容量为0的数组。
add(E e)方法
1 |
public boolean add(E e) { |
从上面来说,每次添加一个新元素都会长度加1,然后复制整个旧数组,由此可见对于写多的操作,效率肯定不会很好。所以CopyOnWriteArrayList适合读多写少的场景。
add(int index, E element)方法
1 |
public void add(int index, E element) { |
set(int index, E element)方法
1 |
public E set(int index, E element) { |
get(int index)方法
读的时候不加锁,代码如下:
1 |
public E get(int index) { |
1 |
private E get(Object[] a, int index) { |
remove()
remove方法不再过多介绍,看完add和set方法应该就能理解。
迭代
内部类COWIterator 实现了ListIterator接口。迭代的时候不能进行remove,add,set等方法,会抛异常。
迭代速度快,迭代时是迭代的数组快照。
1 |
/** Snapshot of the array */ |
源码分析
jdk1.7.0_71
1 |
//锁,保护所有存取器 |
空构造,初始化一个长度为0的数组
1 |
public CopyOnWriteArrayList() { |
利用集合初始化一个CopyOnWriteArrayList
1 |
public CopyOnWriteArrayList(Collection<? extends E> c) {} |
利用数组初始化一个CopyOnWriteArrayList
1 |
public CopyOnWriteArrayList(E[] toCopyIn) {} |
size() 大小
1 |
public int size() {} |
isEmpty()是否为空
1 |
public boolean isEmpty(){} |
indexOf(Object o, Object[] elements,int index, int fence) 元素索引
1 |
private static int indexOf(Object o, Object[] elements,int index, int fence) {} |
indexOf() 元素索引
1 |
public int indexOf(Object o){} |
indexOf(E e, int index) 元素索引
1 |
public int indexOf(E e, int index) {} |
lastIndexOf(Object o, Object[] elements, int index) 元素索引,最后一个
1 |
private static int lastIndexOf(Object o, Object[] elements, int index) {} |
lastIndexOf(Object o) 元素索引,最后一个
1 |
public int indexOf(E e, int index) {} |
lastIndexOf(E e, int index) 元素索引,最后一个
1 |
public int lastIndexOf(E e, int index) {} |
contains(Object o) 是否包含元素
1 |
public boolean contains(Object o){} |
clone() 浅拷贝
1 |
public Object clone() {} |
toArray() 转换成数组
1 |
public Object[] toArray(){} |
toArray(T a[]) 转换成指定类型的数组
1 |
public <T> T[] toArray(T a[]) {} |
E get(int index)获取指定位置的元素
1 |
public E get(int index){} |
set(int index, E element) 指定位置设置元素
写元素的时候,先获得锁,finall块中释放锁
1 |
public E set(int index, E element) { |
add(E e) 元素添加到末尾
1 |
public boolean add(E e) {} |
add(int index, E element) 指定位置之后插入元素
1 |
public void add(int index, E element){} |
remove(int index)删除指定位置的元素
1 |
public E remove(int index) {} |
remove(Object o) 删除第一个匹配的元素
1 |
public boolean remove(Object o) {} |
removeRange(int fromIndex, int toIndex) 删除指定区间的元素
1 |
private void removeRange(int fromIndex, int toIndex) {} |
addIfAbsent(E e) 如果元素不存在就添加进list中
1 |
public boolean addIfAbsent(E e){} |
containsAll(Collection<?> c)是否包含全部
1 |
public boolean containsAll(Collection<?> c){} |
removeAll(Collection<?> c) 移除全部包含在集合中的元素
1 |
public boolean removeAll(Collection<?> c){} |
retainAll(Collection<?> c) 保留指定集合的元素,其他的删除
1 |
public boolean retainAll(Collection<?> c){} |
addAllAbsent(Collection<? extends E> c) 如果不存在就添加进去
1 |
public int addAllAbsent(Collection<? extends E> c) {} |
clear() 清空list
1 |
public void clear(){} |
addAll(Collection<? extends E> c)添加集合中的元素到尾部
1 |
public void addAll(Collection<? extends E> c){} |
addAll(int index, Collection<? extends E> c) 添加集合中元素到指定位置之后
1 |
public boolean addAll(int index, Collection<? extends E> c){} |
toString()
1 |
public String toString(){} |
equals(Object o)
1 |
public boolean equals(Object o) { |
hashCode()
1 |
public int hashCode{} |
listIterator(final int index)和 listIterator() 返回一个迭代器,支持向前和向后遍历
1 |
public ListIterator<E> listIterator(final int index) {} |
iterator() 只能向后遍历
1 |
public Iterator<E> iterator() {} |
subList() 返回部分list
1 |
public List<E> subList(int fromIndex, int toIndex) { |
参考
http://www.cnblogs.com/sunwei2012/archive/2010/10/08/1845656.html