HashMap常见面试题总结(持续更新)
HashMap常见面试题总结(持续更新)
1.HashMap的原理
HashMap是一种集合,继承于Map接口,它的底层是由数组和链表组成的,存储的元素为Entry<K,V>键值对。一个HashMap只允许一个Key为null值,但是允许多个Value为null值。它存储元素主要依赖于Hashcode值,通过对Hashcode进行取高位运算然后与自身进行异或,再通过对数组长度进行取模得到索引位置,得到索引位置后判断是否为null值,如果是null就直接插入,如果不是就遍历链表,看是否存在相同的Key值,存在就更新Value值,不存在就从头部插入新元素,插入后还需判断是否结点数超过8个,超过8个需要转换为红黑树。
2.如何解决Hash冲突
java中解决Hash冲突是依赖于拉链法。得到索引位置后,如果这时候已经有结点存在,就需要遍历当前索引的链表,看是否存在相同的Key值,存在就更新Value值,不存在就从头部插入新元素,插入后还需判断是否结点数超过8个,超过8个需要转换为红黑树。
其他解决Hash冲突的方法还有开放定址法。
3.HashMap的缺点
HashMap主要是依赖于Hashcode值,它在提供超快速的查询效率时也存在一些不好的地方。如果定义一个新类时重新的Hashcode方法不恰当就很容易产生以下两种情况。
所有元素的Hashcode值都一样,这就导致了对应索引处的链表非常的长,查询效率慢,但是后面引进的红黑树针对这种现象提供了很大的优化。
所有元素Hashcode对应的索引值都不相同,这就导致HashMap很容易扩容,造成内存的浪费和进行扩容操作时的不必要开销。
HashMap需要额外计算一次Hash值,如果一开始HashMap的容器大小制定不合适,resize操作会使它多次额外计算Hash值。
————————————————
版权声明:本文为CSDN博主「zZhu_XH」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/zZhu_XH/article/details/114693872