ConcurrentHashMap和hashTable的区别、HashMap和TreeMap区别

深碍√TFBOYSˉ_ 2022-03-29 03:50 434阅读 0赞

ConcurrentHashMap集合了hashmap和hashtable 这两张表的优势:

hashtable 每次操作都会锁住整个结构
ConcurrentHashMap 锁的方式是稍微细粒度
把数据分为了16个桶,每次get put remove 等操作,只需要对对应的桶进行操作就可以了;
读取并发,因为在读取的大多数时候都没有用到锁定,写操作锁定的粒度又非常细,所以,其并发性能大大提升了;

ConcurrentHashMap采用重入锁,对segment 进行加锁。
保证每一个segment是线程安全,这样就保证了整个concurrentHashmap是线程安全的。
1

  1. public ConcurrentHashMap(int initialCapacity,
  2. float loadFactor, int concurrencyLevel) {
  3. if (!(loadFactor > 0) || initialCapacity < 0 || concurrencyLevel <= 0)
  4. throw new IllegalArgumentException();
  5. if (concurrencyLevel > MAX_SEGMENTS)
  6. concurrencyLevel = MAX_SEGMENTS;
  7. // Find power-of-two sizes best matching arguments
  8. int sshift = 0;
  9. int ssize = 1;
  10. // 计算并行级别 ssize,因为要保持并行级别是 2 的 n 次方
  11. while (ssize < concurrencyLevel) {
  12. ++sshift;
  13. ssize <<= 1;
  14. }
  15. // 我们这里先不要那么烧脑,用默认值,concurrencyLevel 为 16,sshift 为 4
  16. // 那么计算出 segmentShift 为 28,segmentMask 为 15,后面会用到这两个值
  17. this.segmentShift = 32 - sshift;
  18. this.segmentMask = ssize - 1;
  19. if (initialCapacity > MAXIMUM_CAPACITY)
  20. initialCapacity = MAXIMUM_CAPACITY;
  21. // initialCapacity 是设置整个 map 初始的大小,
  22. // 这里根据 initialCapacity 计算 Segment 数组中每个位置可以分到的大小
  23. // 如 initialCapacity 为 64,那么每个 Segment 或称之为"槽"可以分到 4 个
  24. int c = initialCapacity / ssize;
  25. if (c * ssize < initialCapacity)
  26. ++c;
  27. // 默认 MIN_SEGMENT_TABLE_CAPACITY 是 2,这个值也是有讲究的,因为这样的话,对于具体的槽上,
  28. // 插入一个元素不至于扩容,插入第二个的时候才会扩容
  29. int cap = MIN_SEGMENT_TABLE_CAPACITY;
  30. while (cap < c)
  31. cap <<= 1;
  32. // 创建 Segment 数组,
  33. // 并创建数组的第一个元素 segment[0]
  34. Segment<K,V> s0 =
  35. new Segment<K,V>(loadFactor, (int)(cap * loadFactor),
  36. (HashEntry<K,V>[])new HashEntry[cap]);
  37. Segment<K,V>[] ss = (Segment<K,V>[])new Segment[ssize];
  38. // 往数组写入 segment[0]
  39. UNSAFE.putOrderedObject(ss, SBASE, s0); // ordered write of segments[0]
  40. this.segments = ss;
  41. }

参考
https://blog.csdn.net/wisgood/article/details/19338693

  1. 2019.01.09更新

》HashMap和TreeMap 的区别:

1、HashMap通常比TreeMap快一点(树和哈希表的数据结构使然),建议多使用HashMap,在需要排序的Map时候才用TreeMap。
2、继承的类不同、
HashMap继承AbstractMap ,
基于哈希表实现,明确定义了hashCode()和equals(),有调优选项;
可以调节 : 初始容量和负载因子

TreeMap继承自SortedMap ,
基于红黑树实现。TreeMap没有调优选项,因为该树总处于平衡状态。
3、性能上:
HashMap:适用于在Map中插入、删除和定位元素。
Treemap:适用于按自然顺序或自定义顺序遍历键(key)。

发表评论

表情:
评论列表 (有 0 条评论,434人围观)

还没有评论,来说两句吧...

相关阅读