容器
1.线程安全的容器都有哪些
同步容器类:
使用了synchronized
1.Vector
2.HashTable
并发容器:
3.ConcurrentHashMap:分段
4.CopyOnWriteArrayList:写时复制
5.CopyOnWriteArraySet:写时复制
Queue:
6.ConcurrentLinkedQueue:
是使用非阻塞的方式实现的基于链接节点的无界的线程安全队列,性能非常好。
(java.util.concurrent.BlockingQueue 接口代表了线程安全的队列。)
7.ArrayBlockingQueue:基于数组的有界阻塞队列
8.LinkedBlockingQueue:基于链表的有界阻塞队列。
9.PriorityBlockingQueue:
支持优先级的无界阻塞队列,即该阻塞队列中的元素可自动排序。默认情况下,元素采取自然升序排列
10.DelayQueue:一种延时获取元素的无界阻塞队列。
11.SynchronousQueue:不存储元素的阻塞队列。每个put操作必须等待一个take操作,否则不能继续添加元素。内部其实没有任何一个元素,容量是0
Deque:
(Deque接口定义了双向队列。双向队列允许在队列头和尾部进行入队出队操作。)
12.ArrayDeque:基于数组的双向非阻塞队列。
13.LinkedBlockingDeque:基于链表的双向阻塞队列。
Sorted容器:
14.ConcurrentSkipListMap:是TreeMap的线程安全版本
15.ConcurrentSkipListSet:是TreeSet的线程安全版本
2.HashMap和HashSet的关系
HashSet与Map关系如下图:
1.HashSet继承于AbstractSet,并且实现了Set接口。
2.HashSet的本质是一个"没有重复元素"的集合,它是通过HashMap实现的。HashSet中含有一个"HashMap类型的成员变量"map,HashSet的操作函数,实际上都是通过map实现的。
3.ArrayList和HashMap的扩容关系
ArrayList:线程不安全,查询速度快
底层数据结构是数组结构
扩容增量:原容量的0.5倍+1
如ArrayList的初始容量为10,一次扩容后容量为16
HashMap:初始容量为16
加载因子为0.75:当元素个数超过容量长度的0.75倍时,进行扩容
扩容增量:原容量的1倍
如HashSet的容量为16,一次扩容后容量为32
ArrayList和HashMap的扩容关系