String类的hashCode方法为何选用31作为乘数因子?

2026-05-27 14:450阅读0评论SEO教程
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计4330个文字,预计阅读时间需要18分钟。

String类的hashCode方法为何选用31作为乘数因子?

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分钟。

String类的hashCode方法为何选用31作为乘数因子?

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 方法的实现,是不是很简单。

阅读全文