Java中的HashMap

转自公众号:程序员小灰

HashMap 是一个用于存储键值对的集合,每个键值对叫做Entry,这些Entry分散存储在一个数组中,这个数组就是 HashMap 的主干。

HashMap 的每一个元素的初始值都是 NULL 


HashMap 的 Put 方法:
例如 hashMap.put("apple",0)。
我们先使用哈希函数来确定 Entry 的插入位置(index)
如果最后计算出来的 index 是2,那么就将这个 Entry 插入相应的位置。
但是 HashMap 的长度是有限的,当插入的 Entry 越来越多时,就会出现 index 冲突的情况,相同的 index 该如何储存呢?
可以使用链表来解决:
HashMap 数组的每一个元素不仅仅是一个 Entry ,也是一个链表的头节点,当新来的 Entry 映射到冲突的数组位置时,
只需要使用“头插法”将 Entry 插入到链表即可。


HashMap 的 Get 方法:
Get 方法是根据 key 来查找 value
首先将输入的 key 做一次 Hash 映射,得到对应的 index,
如果对应的 index 处有多个 Entry ,那么从头开始一个一个的查找。


HashMap 的默认长度是多少? 为什么这么规定?
HashMap 的默认长度是16,并且每次自动扩展或是手动初始化时,长度必须的2的幂。
之所以选择16是为了服务于 Key 映射到 index 的 Hash 算法

一切为了 Hash 算法的均匀分布。


高并发情况下,为什么 HashMap 会出现死锁?
Java8中对 HashMap 的结构有什么优化?

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值