HashMap 总结

本文内容

  1. 哈希表
  2. 实现,关键参数,遍历方式,put操作过程
  3. 多线程场景下的问题
  4. 与其他容器的区别
    1. HashTable
    2. HashSet
    3. ConcurrentHashMap

哈希表:

存储 键值对 的一种数据结构,用空间换时间,查询时间复杂度O(1),最坏O(n)

解决冲突的方法:链表法、线性再散列、二次再散列

实现

用链表法解决冲突,jdk8引入了红黑树,所以底层实现是 数组+链表/红黑树,下表列出jdk8做的改进

 jdk8jdk7
扩容时索引计算方式根据规律,原始 或 原始位置+原始容量重新计算
插入方式头插尾插
判断resize的时机插入元素后插入元素前
结构引入了红黑树 

关键参数

  • loadfactor:负载因子,表中存的元素数目/表的长度,作为判断是否需要扩容的依据
  • length:表长,一定要是2的幂次方,因为是用length-1来求位置的,为了利用所有位置
  • treeify_threshold, untreeify_threshold:结构转化的阈值,默认8,6
  • 最大待扩容长度:2^30

遍历方式

  • entrySet,得到键值对集合
  • 迭代器
  • keySet
  • values

put操作过程

  1. 计算Key的hashcode、位置
  2. 无冲突时直接插入
  3. 有冲突时,根据数组元素是否是TreeNode类型,判定用链表or树的方法
  4. 比较对象相等的流程

    1. 比较hashcode(),不等就返回false;
    2. ==,比较地址,相同则返回true;
    3. equals比较
  5. 根据阈值以及当前链表数判断是否需要进行结构变化
  6. put完毕后判断是否需要扩容
    1. 创建新表
    2. 将每个节点rehash到新表上

多线程场景下的问题

  • 未同步、加锁,多线程put,get的问题
  • jdk7以前头插法会出现死锁

与其他容器的区别

与HashSet的区别
        HashSet内部有一个HashMap,用一个常量Object充当所有key的value

与HashTable的区别

与 ConcurrentHashMap的区别,ConcurrentHashMap做了很多事来保证线程安全

ConcurrentHashMap

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值