如何在应用程序运行时保持对象的哈希码一致?

时间:2014-06-29 14:14:45

标签: java hashcode

想象一下,我们有以下简单的 mutable 类:

public class Point {
  private int x;
  private int y;

  ...

  public void addToX(int delta) {
    x += delta;
  }

  public void addToY(int delta) {
    y += delta;
  }
}

使用唯一的类字段hashCodex覆盖y方法将不起作用,因为在addToX / {{1}时,值可能会在运行时更改}方法被调用。

所以我想知道可变类的addToY的适当实现是什么?

2 个答案:

答案 0 :(得分:3)

假设您在Point#equals(Point p)的实现中使用x和y字段,则无需在Point类型的对象的生命周期内保持Point#hashCode()的一致性。

实际上,java.lang.Object类的javadoc声明了hashCode()

  

每当在同一个对象上多次调用它时   执行Java应用程序时,hashCode方法必须始终如一   返回相同的整数

但在那之后就有了一个限制:

  

,前提是没有在对象的等比较中使用的信息   改性

另见http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#hashCode()

答案 1 :(得分:2)

您在问题中暗示该类并不真正代表静态点,因为您可以更改x和y值。这就是为什么基于x和y值的哈希码对你来说是错误的。我认为这个类真正代表的是一个x和y值可以改变的位置。在这种情况下,你暗示的一个属性是该位置的识别(例如汽车37的位置),即使x / y值确实改变,该识别也不会改变。您希望定义这个具有唯一值的属性,将其添加到您的类中,并将该哈希代码(和等于)实现基于该属性