【问题标题】:Internal address of the object in hashCode() methodhashCode() 方法中对象的内部地址
【发布时间】:2016-02-03 10:49:06
【问题描述】:

根据Object.hashCode()的JavaDoc,此方法返回对象的内部地址,将其转换为整数值。

但是垃圾收集器可以将对象从一个内存段移动到另一个内存段,从而改变它的内部地址。例如,对象可以从Young Generation 移动到Old Generation

参见 java.exe 的以下命令行键:

-XX:+UseSerialGC

-XX:+UseParallelGC

-XX:+UseParallelOldGC

-XX:+UseConcMarkSweepGC

他们决定了垃圾收集的不同算法。

这是否意味着在这种情况下Object.hashCode() 将返回不同的值?

还是总是返回对象初始地址对应的值?

【问题讨论】:

  • 是什么阻止您测试哈希码在 GC 活动下是否保持不变?
  • 看来我得这么做了。不幸的是,没有 API 可以检测对象从一个内存段移动到另一个内存段。如果哈希码被改变,那么由这些对象构成的哈希表就会被破坏,这是不合适的。

标签: garbage-collection hashcode


【解决方案1】:

直接来自 javadoc

hashCode 的一般合约是:

•每当在同一对象上多次调用它时 执行 Java 应用程序时,hashCode 方法必须一致 返回相同的整数,只要不使用 equals 中的信息 对象上的比较被修改。这个整数不需要保留 从应用程序的一次执行到另一次执行一致 相同的应用程序。

【讨论】:

    猜你喜欢
    • 2010-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-08
    • 1970-01-01
    相关资源
    最近更新 更多