HashMap 相关知识点总结

目录

HashMap 的实现原理/底层数据结构?JDK1.7 和 JDK1.8

HashMap 的 put 方法的执行过程?

HashMap 的 get 方法的执行过程?

HashMap 的 resize 方法的执行过程?

HashMap 的 size 为什么必须是 2 的整数次方?

HashMap 多线程死循环问题?

HashMap 的 get 方法能否判断某个元素是否在 map 中?

HashMap 与 HashTable 的区别是什么?

HashMap 与 ConcurrentHashMap 的区别是什么?

HashTable 和 ConcurrentHashMap 的区别?

HashSet 的实现原理是什么?

HashSet 怎么保证元素不重复的?


HashMap 的实现原理/底层数据结构?JDK1.7 和 JDK1.8

        JDK1.7:Entry数组 + 链表

        JDK1.8:Node 数组 + 链表/红⿊树,当链表上的元素个数超过 8 个并且数组⻓度 >= 64 时⾃动转化成红⿊树,节点变成树节点,以提⾼搜索效率和插⼊效率到 O(logN)。Entry 和 Node 都包含 key、value、hash、next 属性。

HashMap 的 put 方法的执行过程?

        当我们想往⼀个 HashMap 中添加⼀对 key-value 时,系统⾸先会计算 key 的 hash 值,然后根据 hash 值确认在 table 中存储的位置。若该位置没有元素,则直接插⼊。否则迭代该处元素链表并依次⽐较其 key 的 hash 值。如 果两个 hash 值相等且 key 值相等(e.hash == hash && ((k = e.key) == key || key.equals(k))),则⽤新的 Entry 的 value 覆盖原来节点的 value。如果两个 hash 值相等但 key 值不等 ,则将该节点插⼊该链表的链头。

HashMap 的 get 方法的执行过程?

        通过 key 的 hash 值找到在 table 数组中的索引处的 Entry,然后返回该 key 对应的 value 即可。 在这⾥能够根据 key 快速的取到 value 除了和 HashMap 的数据结构密不可分外,还和 Entry 有莫⼤的关系。 HashMap 在存储过程中并没有将 key,value 分开来存储,⽽是当做⼀个整体 key-value 来处理的,这个整体就是 Entry 对象。同时 value 也只相当于 key 的附属⽽已。在存储的过程中,系统根据 key 的 HashCode 来决定 Entry 在 table 数组中的存储位置,在取的过程中同样根据 key 的 HashCode 取出相对应的 Entry 对象(value 就包含在 ⾥⾯)。

HashMap 的 resize 方法的执行过程?

有两种情况会调⽤ resize ⽅法:

1. 第⼀次调⽤ HashMap 的 put ⽅法时,会调⽤ resize ⽅法对 table 数组进⾏初始化,如果不传⼊指定值,默 认⼤⼩为 16。

2. 扩容时会调⽤ resize,即 size > threshold 时,table 数组⼤⼩翻倍。 每次扩容之后容量都是翻倍。扩容后要将原数组中的所有元素找到在新数组中合适的位置。

        当我们把 table[i] 位置的所有 Node 迁移到 newtab 中去的时候:这里面的 node 要么在 newtab 的 i 位置(不 变),要么在 newtab 的 i + n 位置。也就是我们可以这样处理:把 table[i] 这个桶中的 node 拆分为两个链表 l1 和 l2:如果 hash &am

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值