当前位置: 首页 > 面试题库 >

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

岳良策
2023-03-14
问题内容

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


问题答案:

我可以看到该文档最早可以追溯到Java 1.2。

的确,总的来说,您不应该依赖散列码实现,而是将其记录为的行为java.lang.String,因此,对其进行更改将视为违反现有合同。

只要有可能,你不应该依赖于哈希码跨版本等保持相同-但在我的脑海里java.lang.String完全是因为算法的特殊情况已经指定了......只要你愿意放弃与以前版本的兼容性当然指定了算法。



 类似资料:
  • 原件: “lorem ipsum dolor sit amet,consectetur adipiscing elit.Sed rutrum imperdiet versit.Nulla eu sapien tincidunt,pellentesque ipsum in,lucuts eros.Nullam tristique arcu lorem,at fringilla lectus tinc

  • 我正在创建一个程序,它可以决定用户的移动方向是否是顺时针方向(N,E,S,W)。 例如,我有变量: UsersDirection不是顺时针方向,因为它必须是“sw”,就像在correctdirection。我不知道如何比较这两个字符串,我甚至不知道如何开始。

  • 如何检查一个字符串是否在另一个字符串中,但匹配项需要在前面,而不是中间或最后。例如,a="

  • 问题 你想在字节字符串上执行普通的文本操作(比如移除,搜索和替换)。 解决方案 字节字符串同样也支持大部分和文本字符串一样的内置操作。比如: >>> data = b'Hello World' >>> data[0:5] b'Hello' >>> data.startswith(b'Hello') True >>> data.split() [b'Hello', b'World'] >>> dat

  • 我正在写一个不和谐机器人游戏,我的问题是玩家必须创造一个角色。然而,每个标准的人都有名字和姓氏,但我在一个命令中接受其他输入。我的问题是,我不确定我的代码是否会在确实放置引号的情况下忽略名称周围的引号。 假设有人给他们的角色命名为乔·什莫。当他们输入命令时,我担心我的参数解释器可能会将“Joe”作为args[0],“Shmoe”作为args[1],将Male作为args[2],将38作为args[

  • 问题内容: 可以说我有这个单词列表: 比我有文字 是否有匹配stopWords并在忽略大小写时将其删除的方法;像这样的地方?: 结果: 如果您了解正则表达式,效果很好,但我真的更喜欢像Commons解决方案这样的东西,它更注重性能。 顺便说一句,现在我正在使用此通用方法,该方法缺少适当的不区分大小写的处理: 问题答案: 这是不使用正则表达式的解决方案。我认为它不如我的其他答案,因为它更长且不清楚,