java - 为什么 Sun 指定 String.hashCode() 实现?

标签 java string hashcode backwards-compatibility

关于依赖 String.hashCode() 的当前实现是否安全似乎一直存在争论,因为从技术上讲,它由规范 (Javadoc) 保证。

  1. 为什么 Sun 在规范中指定 String.hashCode() 的实现?
  2. 为什么开发人员需要依赖 hashCode() 的特定实现?
  3. Sun 为何如此害怕如果将来更改 String.hashCode() 天会塌下来? (这可能是由 #2 解释的)

最佳答案

依赖 hashCode() 的特定实现的一个原因是它是否曾经持久化到数据库、文件或任何其他存储介质中。 Bad Things(tm) 如果在散列算法发生变化时读回数据,就会发生这种情况。您可能会遇到意外的哈希冲突,更令人担忧的是,无法通过其哈希找到某些东西,因为哈希在持久化数据和“现在”之间发生了变化。

事实上,这也很好地解释了第 3 点 =)

第 1 点的原因可能是“允许互操作性”。如果 hashCode 实现被锁定,那么数据可以在不同的 Java 实现之间非常安全地共享。即,无论实现如何,给定对象的散列将始终相同。

关于java - 为什么 Sun 指定 String.hashCode() 实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2255675/

相关文章:

string - 你如何在 Go 中编写多行字符串?

c++ - 如何将 string.erase() 与指针一起使用?

java - 有哪些方法可以使 hashCode/equals 与类的业务定义保持一致?

java - Java中变量的内存地址

java - 为什么空的 Java 字符串的哈希码为零?

java - 以我不需要安装的方式嵌入Java3D是不可能的吗?

java - Android 手机在最大音量时保持静音

java - 在 java 主方法之外初始化一个对象

c++ - std::string 通过索引赋值似乎不起作用

java - 我可以通过配置 java.policy 文件来拒绝对 jvm 类的访问吗?