热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

字符串hashCode()文档与实现

如何解决《字符串hashCode()文档与实现》经验,为你挑选了2个好方法。

下面是String.hashCode()Java 8 的方法源代码片段(准确地说是1.8.0_131)

/**
 * Returns a hash code for this string. The hash code for a
 * {@code String} object is computed as
 * 
 * s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]
 * 
* using {@code int} arithmetic, where {@code s[i]} is the * ith character of the string, {@code n} is the length of * the string, and {@code ^} indicates exponentiation. * (The hash value of the empty string is zero.) * * @return a hash code value for this object. */ public int hashCode() { int h = hash; if (h == 0 && value.length > 0) { char val[] = value; for (int i = 0; i

文档说,你可以看到,这hashCode()是使用下面的公式计算的

s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]

而实际的实施是不同的

for (int i = 0; i 

我错过了任何明显的事情吗?请帮我.



1> rgettman..:

实现是正确的,但需要注意整数溢出可能发生(这里没问题,它不会对任何东西造成伤害).它使用Horner的方法进行多项式评估.

以下是示例字符串"CAT"的步骤.

h = 0

第一循环:

i = 0
h = 31 * 0 + 'C' (67) = 67

第二循环:

i = 1
h = 31 * 67 + 'A' (65) = 2142

第三循环:

i = 2
h = 31 * 2142 + 'T' (84) = 66486

让我们从代码中推导出公式.这里,ni字符串s的索引.循环的每次迭代都for执行此公式.

h n = 31h n-1 + s n

h0 /* after loop i = 0 */ = s[0]
h1 /* after loop i = 1 */ = 31*h0 + s[1] = 31*s[0] + s[1]
h2 /* after loop i = 2 */ = 31*h1 + s[2] = 31*(31*s[0] + s[1]) + s[2]
h = 31*31*s[0] + 31*s[1] + s[2]

你看到31的幂的指数出现是因为每个循环31在添加下一个字符的值之前乘以另一个因子.



2> Turing85..:

最简单的看一些例子会发生什么.让我们采用一串s长度n和所有符号,如上所述.我们将分析迭代的循环迭代.我们将在当前迭代开始时调用h_oldh,并且h_newh在当前迭代结束时调用.很容易看出h_new迭代i将是h_old迭代的i + 1.

??????????????????????????????????????????????????????????????????????????????????????
? It. ? h_old                      ? h_new                                           ?
??????????????????????????????????????????????????????????????????????????????????????
? 1   ? 0                          ? 31*h_old + s[0] =                               ?
?     ?                            ?          s[0]                                   ?
?     ?                            ?                                                 ?
? 2   ? s[0]                       ? 31*h_old + s[1] =                               ?
?     ?                            ? 31      *s[0] +          s[1]                   ?
?     ?                            ?                                                 ?
? 3   ? 31  *s[0] +    s[1]        ? 31^2    *s[0] + 31      *s[1] +    s[2]         ?
?     ?                            ?                                                 ?
? 4   ? 31^2*s[0] + 31*s[1] + s[2] ? 31^3    *s[0] + 31^2    *s[1] + 31*s[2] + s[3]  ?
? :   ? :                          ? :                                               ?
? n   ? ...                        ? 31^(n-1)*s[0] + 31^(n-2)*s[1] + ... + 31^0*s[n] ?
??????????????????????????????????????????????????????????????????????????????????????

(使用Senseful生成的表)

的权力31是通过循环和不断繁殖创造h31(利用的的分布性倍增的).正如您在表格的最后一行中所看到的,这正是文档所说的.


推荐阅读
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • 本文概述了JNI的原理以及常用方法。JNI提供了一种Java字节码调用C/C++的解决方案,但引用类型不能直接在Native层使用,需要进行类型转化。多维数组(包括二维数组)都是引用类型,需要使用jobjectArray类型来存取其值。此外,由于Java支持函数重载,根据函数名无法找到对应的JNI函数,因此介绍了JNI函数签名信息的解决方案。 ... [详细]
  • Whenoverridingtheequals()functionofjava.lang.Object,thejavadocssuggestthat,当重写java.lang. ... [详细]
  • 1.何时需要重写equals()当一个类有自己特有的“逻辑相等”概念(不同于对象身份的概念)。2.为什么改写equals()的时候,总是要改写hashCode()两个原则:hashCode()的返回& ... [详细]
  • -------------------------------------------------android培训、java培训期待与您交流!--------------------------- ... [详细]
  • Java集合类中常见的hashSet,hashMap,hashTable(现已很少用,几乎都采用hashMap替代)的实现都离不开散列表,而散列表的优势在于O(1)级别的查找,而has ... [详细]
  • 本文来自:高爽|Coder,原文地址:http:blog.csdn.netghsauarticledetails16843543,转载请注明。HashMap可以 ... [详细]
  • 如何解决《为什么这个hashCode()方法被认为很差?》经验,为你挑选了1个好方法。 ... [详细]
  • 如何解决《JavaHashSet包含无法正常工作的函数》经验,为你挑选了1个好方法。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • 本文介绍了安全性要求高的真正密码随机数生成器的概念和原理。首先解释了统计学意义上的伪随机数和真随机数的区别,以及伪随机数在密码学安全中的应用。然后讨论了真随机数的定义和产生方法,并指出了实际情况下真随机数的不可预测性和复杂性。最后介绍了随机数生成器的概念和方法。 ... [详细]
  • java散列与散列码探讨,简单HashMap实现散列映射表执行各种操作示列packageorg.rui.collection2.maps;***散列与散列码*将土拔鼠对象与预报对象联系 ... [详细]
  • 你知道一个对象的唯一标志不能仅仅通过写一个漂亮的equals来实现太棒了,不过现在你也必须实现hashCode方法。让我们看看为什么和怎么做才是正确的。相等和哈希码相等是从一般的方面 ... [详细]
author-avatar
摄影爱好者Summer_100
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有