阅读 186

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


文章分类
后端
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐