HashMap, HashTable, ConcurrentHashMap 的区别 TreeMap

1 HashMap, HashTable, ConcurrentHashMap 的区别.
在这里插入图片描述
2 重点: HashMap 和 ConcurrentHashMap 各个版本 的实现细节及区别.

HashMap 1.7 数组+链表.
在这里插入图片描述
HashMap 1.8 数组+链表+红黑树.
在这里插入图片描述
1.7和1.8 主要区别: 当单向链表上的元素个数 (即产生hash冲突的元素) 超过8个, 链表会自动转换成 红黑树, 节点会变成树节点. 当单向链表长度 小于6 的时候, 红黑树就会变回链表.

ConcurrentHashMap 1.7 数组+链表.
在这里插入图片描述
ConcurrentHashMap 1.8 数组+链表+红黑树.
在这里插入图片描述
总结: 1.7都是数组+链表, 1.8都是数组+链表+红黑树.

3 HashMap 是无序的 (因为哈希冲突), 线程不安全. fail-fast 迭代器.
数组存储区间是连续的, 占用内存严重, 所以读取快, 写入慢.

LinkedHashMap 是有序的. (增加了一条 双向链表, 保持 遍历顺序和 插入顺序一致),
线程不安全. 空间复杂度很小, 但时间复杂度很大, 所以读取慢, 写入快.

4 Hashmap.put 操作过程?
(1) 首先会计算 该元素的 hash值, 然后根据hash值确认在 hashmap中存储的位置.
(2) 如果该位置 没有元素, 则直接插入. (1.7是头插, 1.8是尾插)
(3) 如果该位置 有元素, 然后依次比较以该位置元素为头结点的链表元素的 key值.
(4) 如果存在 两个key值相等, 则用 新元素的的value覆盖原来节点的value.
(5) 如果不存在 两个相等的key, 就把该元素 插入到该链表.

为什么线程不安全?
HashMap 底层没有任何加锁机制, 所以在多线程的情况下 HashMap 的单向链表, 在扩容操作的时候, 可能会变成一个 环形的链表, 在遍历的时候就是 死循环.

5 Hashmap 常见的构造方法.
HashMap() 不带参数, 默认初始化大小为 16, 负载因子为 0.75, 扩容为原来容量的 2倍且一定为2的n次幂.
HashMap(int initialCapacity) 指定初始化大小.
HashMap(int initialCapacity , float loadFactor)指定初始化大小和负载因子大小.

(1) 为什么默认容量是 16?
当数组长度为2的n次幂的时候, 不同的key算得得 相同hash值 的几率较小, 减少哈希冲突概率.

(2) 为什么是 0.75?
过大会造成较严重的哈希冲突. 过小会造成较大的空间浪费.

(3) 什么情况下会发生扩容?
1 超过阈值, 比如默认的阈值为16×0.75=12, 超过12再进行put操作时就会进行扩容.
2 链表转为红黑树且数组元素小于等于64.

6 ConcurrentHashMap 和 Hashtable 都是线程安全的. fail-safe 迭代器.

(1) ConcurrentHashMap
1.7
使用 segment 分段锁技术, 基于ReentrantLock实现, 仅仅锁定 map的某个部分.
1.8 使用 CAS + synchronized. 空节点插入使用 CAS, 失败则无条件自旋直至成功. 有Node 节点插入使用 synchronized加锁.

(2) Hashtable. 初始容量为11, 扩容为原来n的 2n+1倍.
使用 synchronized 锁定 整个map. 所以当 Hashtable 的大小增加到一定的时候, 性能会急剧下降, 但是安全性 比前者更高一些.

(3) ConcurrentHashMap 读操作不需要加锁, 写操作需要加锁. Concurrent 包下的类, 先用 volatile 声明一个变量, 然后使用 CAS的原子条件 更新来实现线程之间的同步, 保证了线程安全.

7 第三种 HashMap 线程安全的方式. 使用工具类 Collections的 synchronizedMap 方法.

HashMap map = new HashMap();
Map m = Collections.synchronizedMap(map);

(1) Collection 是一个 集合接口.
(2) Collections 是一个 工具类, 服务于 Collection框架.

8 TreeMap. 底层实现是 红黑树结构, 一棵自平衡的排序二叉树, 可以 保证元素有序.
插入, 删除, 遍历时间复杂度都为 O(logN).

9 红黑树性质.
(1) 每个节点要么是黑色, 要么是红色.
(2) 根节点是黑色.
(3) 每个叶子节点都是 黑色的空节点 (NIL节点).
(4) 每个红色节点的两个子节点都是黑点.
(5) 从任一节点到其每个叶子的所有路径都包含 相同数目的黑色节点.

在这里插入图片描述

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值