千水金年

jdk

2018-06-06

集合框架

  1. Collection是Iterable的继承,所有都有自己的迭代器,而且foreach(for(XX:XX))语句就是用迭代器实现的语法糖

  2. 图中左上灰色部分是线程安全的,但是JDK遗留的类,不推荐使用

    Vector:依靠synchronized修饰方法实现线程安全,已经被CopyOnWriteArrayList取代
    Stack:继承Vector而且不完全符合“栈”数据结构,一般用List代替或者自己实现(建议封装list)
    HashTable:依靠synchronized修饰方法实现线程安全,已经被ConcurrentHashMap取代
    Dictionary:已经被Map取代

数组

  1. ArrayList:没有同步,线程不安全,底层通过System.arraycopy通过拷贝数组来实现数据变化

  2. LinkedList:底层使用链表实现,同时也是队列,而且是双端队列,get方法中会根据下标来判断是从哪一端开始查找

  3. CopyOnWriteArrayList:修改操作使用同一个锁Lock对象,并且会先复制一份原数组,修改之后再写回去,这样遍历的时候

队列

  1. Queue:JDK中的队列底层接口是Queue,它继承于Collection集合接口,队列是一个先入先出(FIFO)的结构,注意区分方法的区别:

    offer:添加,对于有限长度队列,可能返回false即添加失败
    add:添加,JDK底层就是调用offer,失败时抛异常
    poll:删除,删除并获取队列元素,没有则返回null
    remove:删除,JDK底层就是调用poll,没有则抛异常
    peek:获取,获取队列元素,没有则范虎null
    element:获取,JDK底层就是调用peek,没有则抛异常

  2. DeQueue:JDK中的双向队列

  3. ConcurrentLinkedQueue:由head节点和tair节点组成,每个节点(Node)由节点元素(item)和指向下一个节点的引用(next)组成,节点与节点之间就是通过这个next关联起来,从而组成一张链表结构的队列。多线程下是安全的,使用UNSAFE的CAS算法能将入队节点设置成尾节点的next节点,如不成功则重试。

  4. BlockingQueue:阻塞队列,就是在put时候如果队列已满会阻塞,使用的是Condition的await,加了Lock锁,所以是线程安全的。

    ArrayBlockingQueue基于数组,没有读写分离,有界队列;
    LinkedBlockingQueue基于链表,采用读写分离两个锁,可以无界队列可以设置大小;
    SynchronousQueue:无缓冲,相当于队列长度为1;
    PriorityBlockingQueue是排序的相当于加锁的PriorityQueue,本身无界。

集合

Set接口

映射

  1. HashMap:内部有一个table属性,实际是一个数组,每个元素是个Entry键值对的链表头,通过把key值哈希函数得出数组下标去找到对应Entry。 线程不安全,因为是修改的时候会导致数组重新计算,并且没有加锁,线程之间获得的数组就是不同的,fail-fast机制是在数组大小发生变化时及时抛出异常,提示开发者存在不安全操作

  2. ConcurrentHashMap:内部有个segments数组,将整个HashMap分为多个分片,每个分片操作的时候是有锁的,而且分片的数量是固定的


Comments