容器

Map

TreeMap

  • 底层是红黑树
    容器

多线程容器

HashTable&&Vector

  • 所有方法自带锁。
  • java1.0 最早的数据类,所有方法都加了synchronized,基本不会使用这个类型。

HashMap

  • 默认是无锁的,如果需要锁可以使用
 var synchronizedMap = Collections.synchronizedMap(new HashMap<String, String>());
  • 内部还是synchronized锁,因为不是所有方法/地方都需要加锁,所以锁的力度会变小,性能也就可以更高一些,但是使用的依然是synchronized 并没有使用juc里的锁,所以性能依然不是特别高。

ConcurrentHashMap

  • 一般情况下使用这个集合框架

HashTable,HashMap,ConcurrentHashMap 100个线程100w数据插入 性能对比

容器 cost
HashTable 699ms
有锁HashMap 479ms
ConcurrentHashMap 1900ms
  • 如上ConcurrentHashMap 性能反而比另外两种数据类型差,原因是这个数据类型的优势是读取,他在写入里做了很多判断

HashTable,HashMap,ConcurrentHashMap 100个线程100w数据读取 性能对比

容器 cost
HashTable 32680ms
有锁HashMap 38000ms
ConcurrentHashMap 1746ms
  • 读取的时候是另外两种类型的十几倍。

ConcurrentSkipListMap

  • 基于跳表实现,跳表等于分成很多段,根据key 的hash 可以把值的范围控制在一个范围内,锁定范围后只需要在那一个范围里查找即可。
  • 是一个读写速度比较均衡的数据结构

CopyOnWriteArrayList

  • 特点是写的效率比较低,读取的时候不加锁比ConcurrentHashMap快
  • 写的时候的逻辑是每次拷贝一个list 出来并且容量+1,把add 的数据指向最后。
  • 使用场景为读特别多,但是写比较少的情况。

BlockingQueue

  • 阻塞队列 主要包含如下几个常用 api
  • 天生生产者消费者模型
  • 和queue的区别为当put的时候如果满了阻塞住,如果take 没取到也阻塞住。

DelayQueue

  • 延时队列
    image-1652069414273
  • 业务场景为按照时间进行任务调度
  • 可以重写compareTo 去重写排序规则

SynchronousQueue

  • 当put 的生产者数据未被消费者消费,生产者会阻塞住。
    image-1652070234262

TransferQueue

image-1652070605989