Collection
List
- ArrayList
以Object数组形式存储数据,默认容量10;以size*3/2+1作为扩容容量;remove时,先校验index范围,再将index+1后的数据通过System.arraycopy往前位移,最后将末尾元素置空;访问快,但插入删除慢;循环方式有for/foreach,迭代器;非线程安全 - Vector
以Object数组形式存储数据,默认容量10;是ArrayList的synchronized实现 - LinkedList
是双向循环链表的链式线性表;查找时,如果index小于size >> 1,则从头节点开始找,否则从尾节点找;查找较慢,插入删除较快;非线程安全 - CopyOnWriteArrayList
写时复制的List,是一种读写分离的思想,用于读多写少的并发场景,如商品黑白名单;add操作会加锁,先复制容器,再添加元素,最后修改引用至新容器;get时不加锁;缺点:1、内存占用;2、数据一致性
Set
- HashSet
使用HashMap的key存放元素,所以无法重复
Map
- HashMap
以Entry数组形式存储数据,默认容量16,负载因子0.75;每个Entry中,都可以保存相同hash位置的下一个Entry节点,即HashMap可以保存hash冲突的元素,以Entry链表保存;允许key值为null的元素;put时,根据key的haseCode()进行hash运算,再获取存储索引的位置;如果数组大小不小于临界值(容量*负载因子),则扩容为现在大小的2倍;get时,如果Entry节点的hash相同&&key的值相同,则返回此节点。 - Hashtable
以Entry数组形式存储数据,默认容量11,负载因子0.75;是HashMap的synchronized实现。 - ConcurrentHashMap
采用锁分段技术,每个ConcurrentHashMap包含一个Segment数组,每个Segment包含一个HashEntry数组。get时不加锁,除非读到空值才会对某个Segment加锁重读,get时读取的共享变量如count、value都是volatile变量。put时先定位到Segment,并对其加锁,还需判断是否需扩容,再插入。迭代器、get、clear是弱一致性的,详见(http://ifeve.com/concurrenthashmap-weakly-consistent/) - WeakHashMap
同HashMap类似,只是Entry被定义为WeakReference;成员变量ReferenceQueue保存的是被GC回收的键;在get和size/resize,会调用expungeStaleEntries(),从ReferenceQueue中查询并清理持有弱引用的key对象。 - Queue
先进先出(FIFO)规则,从尾部添加,从头部取出;操作:add、remove和element在队列满或空时会抛异常,offer、poll、peek在队列满或空时会返回null或false,put和take在队列满或空时会阻塞;