String类的hashCode方法为何选用31作为乘数因子?
- 内容介绍
- 文章标签
- 相关推荐
本文共计4330个文字,预计阅读时间需要18分钟。
1. 背景:某天,我在编写代码时无意中点开了String的hashCode方法。粗略看了下hashCode的实现,发现其实并不复杂。但令我惊讶的是,从源码中发现了一个奇怪的数字,也是文本的主角。
1. 背景某天,我在写代码的时候,无意中点开了 String hashCode 方法。然后大致看了一下 hashCode 的实现,发现并不是很复杂。但是我从源码中发现了一个奇怪的数字,也就是本文的主角31。这个数字居然不是用常量声明的,所以没法从字面意思上推断这个数字的用途。后来带着疑问和好奇心,到网上去找资料查询一下。在看完资料后,默默的感叹了一句,原来是这样啊。那么到底是哪样呢?在接下来章节里,请大家带着好奇心和我揭开数字31的用途之谜。
2. 选择数字31的原因在详细说明 String hashCode 方法选择数字31的作为乘子的原因之前,我们先来看看 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;
}
上面的代码就是 String hashCode 方法的实现,是不是很简单。
本文共计4330个文字,预计阅读时间需要18分钟。
1. 背景:某天,我在编写代码时无意中点开了String的hashCode方法。粗略看了下hashCode的实现,发现其实并不复杂。但令我惊讶的是,从源码中发现了一个奇怪的数字,也是文本的主角。
1. 背景某天,我在写代码的时候,无意中点开了 String hashCode 方法。然后大致看了一下 hashCode 的实现,发现并不是很复杂。但是我从源码中发现了一个奇怪的数字,也就是本文的主角31。这个数字居然不是用常量声明的,所以没法从字面意思上推断这个数字的用途。后来带着疑问和好奇心,到网上去找资料查询一下。在看完资料后,默默的感叹了一句,原来是这样啊。那么到底是哪样呢?在接下来章节里,请大家带着好奇心和我揭开数字31的用途之谜。
2. 选择数字31的原因在详细说明 String hashCode 方法选择数字31的作为乘子的原因之前,我们先来看看 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;
}
上面的代码就是 String hashCode 方法的实现,是不是很简单。

