【问题标题】:HashCode implementation for generic objects [duplicate]通用对象的HashCode实现[重复]
【发布时间】:2018-05-17 07:40:23
【问题描述】:

我有一个带有这个参数的 Node 类:

    public class Node < T > {
      private T value;
      private int priority;
    }

我知道我需要重写 hashcode 方法,但我不知道该怎么做,因为value 是一个通用对象。我读到可以通过使用对象的地址来完成,但不推荐,因为JVM可以在程序执行期间更改对象的地址。

【问题讨论】:

    标签: java generics methods hash


    【解决方案1】:

    您应该将value.hashCode()priority 值结合起来计算NodehashCode()

    例如:

    @Override
    public int hashCode()
    {
        return 31 * value.hashCode() + priority;
    }
    

    这依赖于Node 类的用户覆盖相关类中的hashCode()(用作Node 值类型的类)。

    请注意,这是 JDK 集合类实现 hashCode 的方式。例如,Sets 的hashCode() 的默认实现是Set 的元素的hashCode()s 之和。

    【讨论】:

    • 即使变量的地址在执行过程中可能发生变化,使用 value.hashCode() 是否正确?
    • @JimBelushi2 value.hashCode() 在执行过程中是否可以改变与地址无关。它与value 的运行时类型及其类的hashCode() 实现有关。
    • 或者换句话说,一个对象的默认值hashCode(也就是它的identityHashCode)永远不会改变,即使对象的地址改变了。
    猜你喜欢
    • 2013-08-06
    • 1970-01-01
    • 2011-07-23
    • 2013-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多