fuzhengwei / CodeGuide

:books: 本代码库是作者小傅哥多年从事一线互联网 Java 开发的学习历程技术汇总,旨在为大家提供一个清晰详细的学习教程,侧重点更倾向编写Java核心内容。如果本仓库能为您提供帮助,请给予支持(关注、点赞、分享)!
https://bugstack.cn
Apache License 2.0
11.05k stars 3.68k forks source link

面经手册 · 第2篇《数据结构,HashCode为什么使用31作为乘数?》 - bugstack虫洞栈 #121

Closed fuzhengwei closed 2 years ago

fuzhengwei commented 4 years ago

https://bugstack.cn/interview/2020/08/04/%E9%9D%A2%E7%BB%8F%E6%89%8B%E5%86%8C-%E7%AC%AC2%E7%AF%87-%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84-HashCode%E4%B8%BA%E4%BB%80%E4%B9%88%E4%BD%BF%E7%94%A831%E4%BD%9C%E4%B8%BA%E4%B9%98%E6%95%B0.html

Why does Java's hashCode() in String use 31 as a multiplier? 这是一个经典问题,也是对数据结构散列表学习的最佳方式。看过这篇文章之后你会彻底了解hashcode为什么使用31作为乘数,它到底发挥了怎样的作用。

mifengjun commented 4 years ago

33号格子为什么看起来没有那么"散列"

fuzhengwei commented 4 years ago

@lvgocc 33号格子为什么看起来没有那么"散列"

单词会有一些比较集中的,比如aaa1,aaa2,aaa3的高频词,只能在同样的词库下,相互比对。

BeiChe14 commented 4 years ago

读完打卡,虽然33跟31的散列效果相似,看数据甚至33的碰撞概率更低。但是在原数据左移5次之后,若再进行+i的操作,可能会引发数据溢出,所以选择-i,即乘数31。