Collection


List:LinkedList ArrayList Vector


Set: HashSet TreeSet


Map: HashTable HashMap WeakHashMap


Arraylist, Vector默认大小:10, 以1.5倍大小增长


HashMap,HashSet默认大小:16, 以2倍大小增长


为优化  HashSet  空间的使用,您可以调优初始容量和负载因子。 TreeSet  不包含调优选项,因为树总是平衡的,保证了插入、删除、查询的性能为 log(n) 。


HashMap内部是数组里存放链表


ArrayList


默认大小是10,以1.5倍扩容


ArrayList基于数组方式实现,无容量限制。


在执行插入元素时可能要扩容,在删除元素时并不会减小数组的容量(如希望相应的减少,可以调用ArrayList的trimToSizse()),在查找元素时要遍历数组,对于 非null的元素采用equals的方式比较


非线程安全的


LinkedList


基于双向链表机制,


插入元素时,创建一个新的Entry,并切换相应元素的前后元素的引用;查找元素时,须遍历链表(小于一半从header遍历,大于一半从双向的尾遍历);删除元素时要遍历链表


线程不安全的


Vector


默认大小是10


方法上加 了synchronized,线程安全的


Stack


继承于Vector


LIFO, 常用于算术运算,最近一次压栈的括号先取出来


HashSet


基于HashMap实现


线程不安全


TreeSet


基于HashSet实现


线程不安全


HashMap


默认大小为16, loadFactor为0.75, 所以只有12大小可用。以2倍大小增长


采用数组方式存储key/value构成的Entry对象,无容量限制


基于key hash寻找Entry对象存放到数组的位置,对于hash冲突采用链表的方式来解决。


在插入元素时可能要扩大数组容量,在扩大数组容量时须重新计算hash.并复制对象到新的数组。


非线程安全的


Hashtable


加synchronized,线程安全的


TreeMap


基于红黑树实现;无容量限制; Comparator接口,可排序


线程不安全


java并发包java.util.concurrent


ConcurrentHashMap: 采用分段锁机制,任意数量的读取线程可以并发地访问Map,执行读取操作的线程和执行写入操作的线程可以并发地访问Map,并且一定数量的写入线程可以并发地修改Map.


ConcurrentHashMap返回的迭代器具有弱一致性,而并非及时失败。弱一致性的迭代器可以容忍并发的修改。


因此size和isEmpty方法返回的是一个让近似值而不是一个精确值。但是这两个值在并发环境下的用处很小,因为它们的返回值总是在不断变化。


initCapacity loadFactor concurrencyLevel(分段锁分几段,默认16段)


CopyOnWriteArrayList


采用ReentrantLock保证add remove等的线程安全性,读操作时无锁


初始数组大小为0;每次add时,new一个新的数组,大小为当前数组大小+1;