Java中的HashMap

来源:互联网 发布:网络女歌手歌曲大全 编辑:程序博客网 时间:2024/06/04 23:22

转自公众号:程序员小灰

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 的结构有什么优化?