集合框架
-
Collection是Iterable的继承,所有都有自己的迭代器,而且foreach(for(XX:XX))语句就是用迭代器实现的语法糖
-
图中左上灰色部分是线程安全的,但是JDK遗留的类,不推荐使用
Vector:依靠synchronized修饰方法实现线程安全,已经被CopyOnWriteArrayList取代
Stack:继承Vector而且不完全符合“栈”数据结构,一般用List代替或者自己实现(建议封装list)
HashTable:依靠synchronized修饰方法实现线程安全,已经被ConcurrentHashMap取代
Dictionary:已经被Map取代
数组
-
ArrayList:没有同步,线程不安全,底层通过System.arraycopy通过拷贝数组来实现数据变化
-
LinkedList:底层使用链表实现,同时也是队列,而且是双端队列,get方法中会根据下标来判断是从哪一端开始查找
-
CopyOnWriteArrayList:修改操作使用同一个锁Lock对象,并且会先复制一份原数组,修改之后再写回去,这样遍历的时候
队列
- Queue:JDK中的队列底层接口是Queue,它继承于Collection集合接口,队列是一个先入先出(FIFO)的结构,注意区分方法的区别:
offer:添加,对于有限长度队列,可能返回false即添加失败
add:添加,JDK底层就是调用offer,失败时抛异常
poll:删除,删除并获取队列元素,没有则返回null
remove:删除,JDK底层就是调用poll,没有则抛异常
peek:获取,获取队列元素,没有则范虎null
element:获取,JDK底层就是调用peek,没有则抛异常 -
DeQueue:JDK中的双向队列
-
ConcurrentLinkedQueue:由head节点和tair节点组成,每个节点(Node)由节点元素(item)和指向下一个节点的引用(next)组成,节点与节点之间就是通过这个next关联起来,从而组成一张链表结构的队列。多线程下是安全的,使用UNSAFE的CAS算法能将入队节点设置成尾节点的next节点,如不成功则重试。
- BlockingQueue:阻塞队列,就是在put时候如果队列已满会阻塞,使用的是Condition的await,加了Lock锁,所以是线程安全的。
ArrayBlockingQueue基于数组,没有读写分离,有界队列;
LinkedBlockingQueue基于链表,采用读写分离两个锁,可以无界队列可以设置大小;
SynchronousQueue:无缓冲,相当于队列长度为1;
PriorityBlockingQueue是排序的相当于加锁的PriorityQueue,本身无界。
集合
Set接口
映射
-
HashMap:内部有一个table属性,实际是一个数组,每个元素是个Entry键值对的链表头,通过把key值哈希函数得出数组下标去找到对应Entry。 线程不安全,因为是修改的时候会导致数组重新计算,并且没有加锁,线程之间获得的数组就是不同的,fail-fast机制是在数组大小发生变化时及时抛出异常,提示开发者存在不安全操作
-
ConcurrentHashMap:内部有个segments数组,将整个HashMap分为多个分片,每个分片操作的时候是有锁的,而且分片的数量是固定的