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()方法,迭代器的定义为:提供一种方法访问一个容器对象中各个元素,而又不需要暴露该对象的内部细节。
它的特点是更加安全,因为它可以确保,在当前遍历的集合元素不被修改,如果便利时修改元素,就会报错。