我正在阅读Joshua Bloch的Effective Java 2nd Edition。
在这一段中,他提到:
Java平台库中的许多类(如String,Integer和Date)在其规范中包含hashCode方法返回的实际值作为实例值的函数。这通常不是一个好主意,因为它严重限制了您在将来的版本中改进哈希函数的能力。如果您未指定散列函数的详细信息并发现缺陷或发现更好的散列函数,则可以在后续版本中更改散列函数,确信没有客户端依赖散列函数返回的确切值。
任何人都可以分享一些见解他的意思是什么'确切'值。我看了一下String实现类,但仍然无法理解他的意思......
提前致谢!
答案 0 :(得分:7)
来自String.hashCode()
:
返回此字符串的哈希码。 String对象的哈希码 计算为
s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]
通过在javadoc中给出定义,人们可以编写完全依赖于散列算法的代码。在将来的版本中更改哈希算法会破坏该代码。
答案 1 :(得分:2)
这意味着hashCode()
返回的值在Javadoc中规定。
e.g。
返回此字符串的哈希码。 String对象的哈希码计算为
s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]
[返回]此对象的哈希码值,等于此Integer对象表示的原始int值。
返回此对象的哈希码值。结果是getTime()方法返回的原始long值的两半的异或。也就是说,哈希码是表达式的值:
(int)(this.getTime()^(this.getTime() >>> 32))
答案 2 :(得分:2)
如果您查看java.lang.String.hashCode()
的API文档,它会准确描述该方法的实现方式:
返回此字符串的哈希码。 String对象的哈希码计算为
s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]
使用int算术,其中s [i]是字符串的第i个字符,n是字符串的长度,^表示取幂。 (空字符串的哈希值为零。)
Bloch说的是,String
这样的类描述API文档中的实现细节是错误的,因为这意味着程序员可以指望以这种方式实现的hashCode
方法。如果在未来的Java版本中,Oracle希望实现一种不同的,可能更有效的算法来计算字符串的哈希码,那么这将是一个向后兼容性问题 - 与以前的Java版本相比,行为可能会发生变化。
通过在API文档中详细描述实现,它的实现方式已成为Java API官方规范的一部分。
一般而言,API文档应该只描述方法的目的,而不是具体如何实现。