我们先来看看 String hashCode 方法是怎样实现的,如下: 代码语言:javascript 代码运行次数:0 运行 AI代码解释 publicinthashCode(){int h=hash;if(h==0&&value.length>0){char val[]=value;for(int i=0;i<value.length;i++){h=31*h+val[i];}hash=h;}returnh;} hashCode 方法核心的计算逻辑只有三行...
上面的代码就是 String hashCode 方法的实现,是不是很简单。实际上 hashCode 方法核心的计算逻辑只有三行,也就是代码中的 for 循环。我们可以由上面的 for 循环推导出一个计算公式,hashCode 方法注释中已经给出。如下: s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1] 这里说明一下,上面的 s ...
31有个很好的特性,即用移位和减法来代替乘法,可以得到更好的性能:31 * i ==(i << 5)- i。现代的VM可以自动完成这种优化。 https://stackoverflow.com/questions/299304/why-does-javas-hashcode-in-string-use-31-as-a-multiplier 这是个比较有争议的答案,分为三部分来讨论: 为什么要选择奇数 如果...
首先看下String源码里的hashCode是如何实现的: public int hashCode() {int h = hash;if (h == 0 && value.length > 0) {char val[] = value;for (int i = 0; i < value.length; i++) {h = 31 * h + val[i];}hash = h;}return h;} 实际上 hashCode 方法核心的计算逻辑只有三行,也...
上面的代码就是 String hashCode 方法的实现,是不是很简单。实际上 hashCode 方法核心的计算逻辑只有三行,也就是代码中的 for 循环。 我们可以由上面的 for 循环推导出一个计算公式,hashCode 方法注释中已经给出。如下: s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1] ...
上面的代码就是 String hashCode 方法的实现,是不是很简单。实际上 hashCode 方法核心的计算逻辑只有三行,也就是代码中的 for 循环。我们可以由上面的 for 循环推导出一个计算公式,hashCode 方法注释中已经给出。如下:s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]...
1 public int hashCode() { 2 int h = hash; 3 if (h == 0 && value.length > 0) { 4 char val[] = value; 5 6 for (int i = 0; i < value.length
上面的代码就是 String hashCode 方法的实现,是不是很简单。实际上 hashCode 方法核心的计算逻辑只有三行,也就是代码中的 for 循环。我们可以由上面的 for 循环推导出一个计算公式,hashCode 方法注释中已经给出。如下: s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1] ...
31 的一个很好的属性是可以用移位和减法代替乘法以获得更好的性能: 31 * i == (i << 5) - i 。现代虚拟机自动进行这种优化。 (来自第 3 章第 9 项:当您覆盖 equals 时始终覆盖 hashcode,第 48 页) 原文由 matt b 发布,翻译遵循 CC BY-SA 2.5 许可协议 ...
Java中String类的hashCode方法的实现是基于乘法的哈希函数。乘法哈希函数的一般形式是:hash = key * M...