集合总结

总结

add/offer/put的区别
add 队尾添加抛异常 remove
offer 添加不进去返回false poll
put 添加不进去 阻塞 take

element/peek 用于查询队列的头部元素 不移除

  1. put/take方法在****BlockingQueue类型的阻塞队列中使用,可用于多线程对同一数据的同步处理过程中,如数据流的写入与读取等;

  2. add/remove/element属于同组方法,对异常操作会抛出异常处理

  3. offer/poll/peek属于同组方法,对于异常操作不会跑出异常,只会返回false。

集合框架

简单容器

  1. vector 安全synchronized的list
  2. ArrayList 对象数组,实现RandomAccess, forEach遍历时使用二分遍历 每次扩容1.5倍 初始容量 10
  3. LinkedList 链表对象串起来,遍历next遍历 占空间
  4. ArrayDeque 双指针分别表明是头和尾,取出放入时根据此调整位置 addLast 3456___12 addLast 放在6后, addFirst放在1前, 碰面复制, 再放
  5. HashSet 内部保存了一个HashMap 存储的key为保存的值。value是一个没用的对象
  6. HashMap 默认16, 达到0.75 容量时扩大2倍 内部保存了Node[] , 每次根据键值计算Hash确定桶位置,放入,冲突就放在上一个的next节点上
  7. LinkedHashMap 只是使用了Entry 继承了Node 同时多加了两个参数before和after 将他们串起来
  8. PriorityQueue 最小顶堆,最小的值永远在最上面,每次放入都进行调整
  9. ArrayBlockingQueue 阻塞队列 生产者消费者, 内部保存数组, 生产满了,wait, 生产后就通知阻塞的消费线程消费
  10. LinkedBlockingQueue 双锁读写分离
  11. CopyOnWriteArrayList 写的时候加锁 复制一份新的,添加修改, 读取读取旧的值不影响, 读效率高

并发容器

这些容器的关键方法大部分都实现了线程安全的功能,却不使用同步关键字 (synchronized)。值得注意的是 Queue 接口本身定义的几个常用方法的区别,

  1. add 方法和 offer 方法的区别在于超出容量限制时前者抛出异常,后者返回 false;
  2. remove 方法和 poll 方法都从队列中拿掉元素并返回,但是他们的区别在于空队列下操作前者抛出异常,而后者返回 null;
  3. element 方法和 peek 方法都返回队列顶端的元素,但是不把元素从队列中删掉,区别在于前者在空队列的时候抛出异常,后者返回 null。

阻塞队列:

  • BlockingQueue.class,阻塞队列接口
  • BlockingDeque.class,双端阻塞队列接口
  • ArrayBlockingQueue.class,阻塞队列,数组实现
  • LinkedBlockingDeque.class,阻塞双端队列,链表实现 可设置大小 condition 相互唤醒, noEmpty noFull
  • LinkedBlockingQueue.class,阻塞队列,链表实现
  • DelayQueue.class,阻塞队列,并且元素是 Delay 的子类,保证元素在达到一定时间后才可以取得到
  • PriorityBlockingQueue.class,优先级阻塞队列
  • SynchronousQueue.class,同步队列,但是队列长度为 0,生产者放入队列的操作会被阻塞,直到消费者过来取,所以这个队列根本不需要空间存放元素;有点像一个独木桥,一次只能一人通过,还不能在桥上停留
    非阻塞队列:
  • ConcurrentLinkedDeque.class,非阻塞双端队列,链表实现
  • ConcurrentLinkedQueue.class,非阻塞队列,链表实现
    转移队列:
  • TransferQueue.class,转移队列接口,生产者要等消费者消费的队列,生产者尝试把元素直接转移给消费者
  • LinkedTransferQueue.class,转移队列的链表实现,它比 SynchronousQueue 更快
    其它容器:
  • ConcurrentMap.class,并发 Map 的接口,定义了 putIfAbsent(k,v)、remove(k,v)、replace(k,oldV,newV)、replace(k,v) 这四个并发场景下特定的方法
  • ConcurrentHashMap.class,并发 HashMap
  • ConcurrentNavigableMap.class,NavigableMap 的实现类,返回最接近的一个元素
  • ConcurrentSkipListMap.class,它也是 NavigableMap 的实现类(要求元素之间可以比较),同时它比 ConcurrentHashMap 更加 scalable——ConcurrentHashMap 并不保证它的操作时间,并且你可以自己来调整它的 load factor;但是 ConcurrentSkipListMap 可以保证 O(log n) 的性能,同时不能自己来调整它的并发参数,只有你确实需要快速的遍历操作,并且可以承受额外的插入开销的时候,才去使用它
  • ConcurrentSkipListSet.class,和上面类似,只不过 map 变成了 set
  • CopyOnWriteArrayList.class,copy-on-write 模式的 array list,每当需要插入元素,不在原 list 上操作,而是会新建立一个 list,适合读远远大于写并且写时间并苛刻的场景
    CopyOnWriteArraySet.class,和上面类似,list 变成 set 而已
posted @ 2022-10-11 16:12  jojoworld  阅读(14)  评论(0编辑  收藏  举报