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;