List下的成员

Arraylist: Object[]数组
Vector:Object[]数组
LinkedList: 双向链表(JDK1.6 之前为循环链表,JDK1.7 取消了循环)

和List有关的线程安全的类

java.util.Collections.synchronizedList() 在方法内部加锁syn
java.util.Concurrent.CopyOnWriteArrayList 加写锁,不加读锁,用 reentrant加锁lock实现,扩容时,只是size+1。

并发包中的线程安全的类

  • ConcurrentHashMap: 可以看作是线程安全的 HashMap
  • CopyOnWriteArrayList:可以看作是线程安全的 ArrayList,在读多写少的场合性能非常好,远远好于 Vector.
  • ConcurrentLinkedQueue:高效的并发队列,使用链表实现。可以看做一个线程安全的 LinkedList,这是一个非阻塞队列。
  • BlockingQueue: 这是一个接口,JDK 内部通过链表、数组等方式实现了这个接口。表示阻塞队列,非常适合用于作为数据共享的通道。

List相关类的特点

ArrayList

默认容量为10,1.5倍扩容,动态数组。与Arrays不同

Vector

方法上加锁,默认容量为10,2倍扩容

public synchronized boolean add(E e) {
    modCount++;
    ensureCapacityHelper(elementCount + 1);
    elementData[elementCount++] = e;
    return true;
}

public synchronized E get(int index) {
    if (index >= elementCount)
        throw new ArrayIndexOutOfBoundsException(index);

    return elementData(index);
}

LinkedList

双向链表,具备的是链表的特点

Set下的成员(Set不允许重复元素)

HashSet 是 Set 接口的主要实现类 ,HashSet 的底层是 HashMap,线程不安全的,可以存储 null 值;

LinkedHashSet 是 HashSet 的子类,能够按照添加的顺序遍历;加入了双向链表以保证有序

TreeSet 底层使用红黑树,能够按照添加元素的顺序进行遍历,排序的方式有自然排序和定制排序。

Iterator 迭代器

为了遍历集合中的元素,产生了迭代器。遍历方式都是 hasNext()和next()方法,迭代器的定义为:提供一种方法访问一个容器对象中各个元素,而又不需要暴露该对象的内部细节。

它的特点是更加安全,因为它可以确保,在当前遍历的集合元素不被修改,如果便利时修改元素,就会报错。