一、List简介
List是一种线性的数据结构,Java中对List实现主要有Vector、ArrayList、LinkedList、SynchronizedList等。
-
Vector和ArrayList都是通过数组实现的,优点是适合随机查找和遍历,不适合频繁插入和删除。
-
Vector支持线程同步,因此访问开销更大。
-
LinkedList是用链表结构存储数据,适合动态插入和删除,随机访问和遍历速度相对较慢。
-
SynchronizedList也是线程安全的,但和Vector有区别。Vector所有需要同步的方法都使用同步方法实现,SynchronizedList使用同步代码块实现。SynchronizedList中实现的类并没有都使用synchronized同步代码块。SynchronizedList可以指定锁定的对象,mutex是成员变量。
二、List的基本操作
public interface List<E> extends Collection<E> {
int size();
boolean isEmpty();
boolean contains(Object o);
Iterator<E> iterator();
Object[] toArray();
boolean add(E e);
boolean remove(Object o);
boolean containsAll(Collection<?> c);
boolean addAll(Collection<? extends E> c);
boolean addAll(int index, Collection<? extends E> c);
boolean removeAll(Collection<?> c);
void clear();
boolean equals(Object o);
int hashCode();
E get(int index);
E set(int index, E element);
void add(int index, E element);
E remove(int index);
int indexOf(Object o);
int lastIndexOf(Object o);
ListIterator<E> listIterator();
ListIterator<E> listIterator(int index);
List<E> subList(int fromIndex, int toIndex);
}
三、CopyOnWriteArrayList
Copy-On-Write简称COW,其基本思路是,从一开始大家都在共享同一个内容,当某个人想要修改这个内容的时候,才会真正把内容Copy出去形成一个新的内容然后再改,这是一种延时懒惰策略。
CopyOnWrite容器即写时复制的容器。通俗的理解是当我们往一个容器添加元素的时候,不直接往当前容器添加,而是先将当前容器进行Copy,复制出一个新的容器,然后新的容器里添加元素,添加完元素之后,再将原容器的引用指向新的容器。这样做的好处是我们可以对CopyOnWrite容器进行并发的读,而不需要加锁,因为当前容器不会添加任何元素。所以CopyOnWrite容器也是一种读写分离的思想,读和写不同的容器。COW是不能保证可见性的。