hashCode()是如何实现的?
我的假设是它使用对象内存位置作为初始数字(种子),然后运行哈希函数。然而,这并不是事实。
我也看过Hash : How does it work internally?,但它没有回答我的问题。
是的,我可以下载SDK,但在这样做之前,也许有人已经了解了它。
谢谢 :)
编辑: 我知道它应该被覆盖等,所以请试着保持主题 :)
hashCode()是如何实现的?
我的假设是它使用对象内存位置作为初始数字(种子),然后运行哈希函数。然而,这并不是事实。
我也看过Hash : How does it work internally?,但它没有回答我的问题。
是的,我可以下载SDK,但在这样做之前,也许有人已经了解了它。
谢谢 :)
编辑: 我知道它应该被覆盖等,所以请试着保持主题 :)
Object.hashCode()
是一个本地方法,因此它的实现完全取决于JVM。它可能在HotSpot和其他VM实现(如JRockit或IBM J9)之间有所不同。那么答案是:它取决于你使用的VM。
hashCode()
在Java中是如何实现的?
hashCode()
实现。你可以使用-XX:hashCode=n
标志通过命令行运行JVM来选择它,其中n
可以是:0 – Park-Miller RNG (default)
1 – f(address, global_statement)
2 – constant 1
3 – Serial counter
4 – Object address
5 – Thread-local Xorshift
if (hashCode == 0) {
value = os::random();
} else {
...
os::random()
只是Park-Miller伪随机生成算法的实现。
就这样。 没有任何关于内存地址的概念。虽然另外两个实现,1
和4
,使用对象的内存地址,但默认的不使用它。
Object.hashCode()
基于对象地址的概念在很大程度上是一个历史遗产——这已经不再是真实的了。
Object#hashCode()
的JavaDoc中,我们可以阅读到:
(...) 这通常是通过将对象的内部地址转换为整数来实现的,但这种实现技术不是Java™编程语言所必需的。
但它已经过时且误导人。
Object#hashCode()
的javadoc也会误导人。 - G. Demeckihashcode() 函数的实现因对象而异。如果您想知道特定类如何实现 hashcode(),则必须查找该类。
Object类定义的hashCode方法为不同的对象返回不同的整数。这可以通过将对象的内部地址转换为整数来实现(但此实现风格不是标准所必需的)。对于覆盖hashCode以支持哈希表(equal和hashCode)的新类,情况变得有趣: http://www.javapractices.com/topic/TopicAction.do?Id=28
我假设你在谈论hashCode
的Object
实现,因为该方法可以和应该被重写。
它的实现取决于具体情况。对于Sun JDK而言,它是基于对象的内存地址。