{{:pasted:20160228-133133.png}} ===== Vector ===== 向量,历史比较悠久,Java诞生就有了,特点与ArrayList相同, 不同的是Vector操作元素的方法是同步的,同一时刻只能有一个线程访问,没有特殊需求都使用ArrayList 构造方法 public Vector() public Vector(int initialCapacity) public Vector(int initialCapacity,int capacityIncrement) 第一个参数是初始容量,第二个参数是当Vector满时的增量 public Vector(Collection c) Vector也是依赖数组实现的 Vector非常类似ArrayList,但是Vector是同步的。由Vector创建的Iterator,虽然和ArrayList创建的Iterator是同一接口,但是,因 为Vector是同步的,当一个Iterator被创建而且正在被使用,另一个线程改变了Vector的状态(例如,添加或删除了一些元素),这时调用 Iterator的方法时将抛出ConcurrentModificationException,因此必须捕获该异常 ===== Stack ===== * Vector的子类,在vector的基础上增加了 pop,push函数 ===== ArrayList 和 LinkedList ===== ArrayList底层采用数组实现,LinkedList底层采用双链表实现 LinkedList底层Entry结构 Entry{ Entry previous; Object element; Entry next; } 插入和删除操作时,采用LinkedList好,搜索时,采用ArrayList好 ===== TreeSet ===== * 有序集合,底层基于Map ===== HashSet ===== * 无序集合,底层基于HashMap ===== LinkedHashSet ===== * 基于HashSet,并增加了几个函数 ===== HashMap ===== * 线程不安全 ===== HashTable ===== * 线程安全 ===== LinkedHashMap ===== * 基于HashMap,底层用链表实现 ===== TreeMap ===== * 有顺Map(按key排序) CopyOnWrite容器即写时复制的容器。通俗的理解是当我们往一个容器添加元素的时候,不直接往当前容器添加,而是先将当前容器进行Copy,复制出一个新的容器,然后新的容器里添加元素,添加完元素之后,再将原容器的引用指向新的容器。这样做的好处是我们可以对CopyOnWrite容器进行并发的读,而不需要加锁,因为当前容器不会添加任何元素。所以CopyOnWrite容器也是一种读写分离的思想,读和写不同的容器。 缺点:(1)内存消耗大(2)只能保证数据的最终一致性,不能保证数据的实时一致性 ===== CopyOnWriteArrayList ===== * ArrayList不是线程安全的,如果一个线程在遍历List,另一个线程再修改List,则报错 * CopyOnWriteArrayList是线程安全的,每次在修改的时候会先复制一个备份,修改备份。所以非常适合多线程情况下使用 ===== CopyOnWriteArraySet ===== * 原理和CopyOnWriteArrayList类似 ===== ConcurrentHashMap ===== * 线程不安全的HashMap,多线程下无法使用 * HashTable容器使用synchronized来保证线程安全,但在线程竞争激烈的情况下HashTable的效率非常低下 * HashTable容器在竞争激烈的并发环境下表现出效率低下的原因,是因为所有访问HashTable的线程都必须竞争同一把锁,那假如容器里有多把锁,每一把锁用于锁容器其中一部分数据,那么当多线程访问容器里不同数据段的数据时,线程间就不会存在锁竞争,从而可以有效的提高并发访问效率,这就是ConcurrentHashMap所使用的锁分段技术,首先将数据分成一段一段的存储,然后给每一段数据配一把锁,当一个线程占用锁访问其中一个段数据的时候,其他段的数据也能被其他线程访问。 * 内部有依赖volatile的技术,保证共享变量在线程之间保持可见性 * 具体见:http://ifeve.com/concurrenthashmap/