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()完全不相关。
3 回答

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

守候你守候我
TA贡献1802条经验 获得超10个赞
您不应该依赖等于特定值的哈希码。只是它将在同一执行中返回一致的结果。API文档说以下内容:
hashCode的一般约定为:
在Java应用程序的执行过程中,只要在同一对象上多次调用它,则hashCode方法必须一致地返回相同的整数,前提是未修改该对象的equals比较中使用的信息。从一个应用程序的执行到同一应用程序的另一执行,此整数不必保持一致。
编辑 由于String.hashCode()的javadoc指定了字符串的哈希码的计算方式,因此任何违反此规定的行为都会违反公共API规范。
添加回答
举报
0/150
提交
取消