当您创建自己的密钥对对象时,您应该面对一些事情。
首先,您应该了解实现hashCode()
和equals()
. 您将需要这样做。
其次,在实施时hashCode()
,请确保您了解它是如何工作的。给定的用户示例
public int hashCode() {
return this.x ^ this.y;
}
实际上是您可以做的最糟糕的实现之一。原因很简单:你有很多相等的哈希值!并且hashCode()
应该返回往往很少见的 int 值,最好是唯一的。使用这样的东西:
public int hashCode() {
return (X << 16) + Y;
}
这速度很快,并为 -2^16 和 2^16-1(-65536 到 65535)之间的键返回唯一的哈希值。这几乎适用于任何情况。很少你会超出这个界限。
第三,在实现时equals()
还要知道它的用途并注意如何创建密钥,因为它们是对象。通常你会做不必要的 if 语句,因为你总是会得到相同的结果。
如果您像这样创建密钥:map.put(new Key(x,y),V);
您将永远不会比较密钥的引用。因为每次您想要访问地图时,您都会执行类似map.get(new Key(x,y));
. 因此,您equals()
不需要像if (this == obj)
. 它永远不会发生。
而不是if (getClass() != obj.getClass())
在您equals()
更好地使用if (!(obj instanceof this))
. 它甚至对子类也有效。
所以你唯一需要比较的是X和Y。所以equals()
在这种情况下最好的实现是:
public boolean equals (final Object O) {
if (!(O instanceof Key)) return false;
if (((Key) O).X != X) return false;
if (((Key) O).Y != Y) return false;
return true;
}
所以最后你的关键类是这样的:
public class Key {
public final int X;
public final int Y;
public Key(final int X, final int Y) {
this.X = X;
this.Y = Y;
}
public boolean equals (final Object O) {
if (!(O instanceof Key)) return false;
if (((Key) O).X != X) return false;
if (((Key) O).Y != Y) return false;
return true;
}
public int hashCode() {
return (X << 16) + Y;
}
}
您可以提供维度索引X
和Y
公共访问级别,因为它们是最终的并且不包含敏感信息。我不能 100 %确定private
在将Object
.Key
如果你想知道决赛,我将任何东西声明为 final,它的值是在实例化时设置的并且永远不会改变 - 因此是一个对象常量。