用户工具


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

<color red>ArrayList底层采用数组实现,LinkedList底层采用双链表实现</color>

  
    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所使用的锁分段技术,首先将数据分成一段一段的存储,然后给每一段数据配一把锁,当一个线程占用锁访问其中一个段数据的时候,其他段的数据也能被其他线程访问