猿问

Java字符串上hashCode()的一致性

Java字符串的hashCode值计算为(String.hashCode()):


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

是否在任何情况下(例如JVM版本,供应商等),以下表达式将被评估为false?


boolean expression = "This is a Java string".hashCode() == 586653468

更新#1:如果您声称答案是“是的,则有这种情况”-然后请举一个具体示例说明何时“这是Java字符串”。hashCode()!=586653468。请尽量具体/具体尽可能。


更新#2:我们都知道,依赖hashCode()的实现细节通常是不好的。但是,我在专门谈论String.hashCode()-因此请始终将答案集中在String.hashCode()上。在此问题的上下文中,Object.hashCode()完全不相关。


至尊宝的传说
浏览 590回答 3
3回答

繁星coding

我可以看到该文档最早可以追溯到Java 1.2。的确,总的来说,您不应该依赖散列码实现,而现在已记录了的行为java.lang.String,因此更改它将被视为违反现有合同。只要有可能,你不应该依赖于哈希码跨版本等保持相同-但在我的脑海里java.lang.String完全是因为算法的特殊情况已经指定了......只要你愿意放弃与以前版本的兼容性当然指定了算法。

守候你守候我

您不应该依赖等于特定值的哈希码。只是它将在同一执行中返回一致的结果。API文档说以下内容:hashCode的一般约定为:在Java应用程序的执行过程中,只要在同一对象上多次调用它,则hashCode方法必须一致地返回相同的整数,前提是未修改该对象的equals比较中使用的信息。从一个应用程序的执行到同一应用程序的另一执行,此整数不必保持一致。编辑 由于String.hashCode()的javadoc指定了字符串的哈希码的计算方式,因此任何违反此规定的行为都会违反公共API规范。
随时随地看视频慕课网APP

相关分类

Java
我要回答