当您创建自己的密钥对对象时,您应该面对一些事情。
首先,您应该了解实现 和 。您将需要执行此操作。hashCode()
equals()
其次,在实现时,请确保您了解它的工作原理。给定的用户示例hashCode()
public int hashCode() {
return this.x ^ this.y;
}
实际上是您可以做的最糟糕的实现之一。原因很简单:你有很多相等的哈希值!并且应该返回的int值往往是罕见的,在最好的情况下是唯一的。使用类似如下的内容:hashCode()
public int hashCode() {
return (X << 16) + Y;
}
这很快,并且返回 -2^16 和 2^16-1(-65536 到 65535)之间的键的唯一哈希。这几乎适用于任何情况。你很少超出这个界限。
第三,在实现时还要知道它的用途,并注意如何创建键,因为它们是对象。通常,如果语句导致您始终具有相同的结果,则您执行不必要的操作。equals()
如果像这样创建密钥:您将永远不会比较密钥的引用。因为每次你想访问地图时,你都会做类似的事情。因此,您不需要像 .它永远不会发生。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;
}
}
您可以为维度索引和公共访问级别指定,因为它们是最终的,不包含敏感信息。我不是100%确定访问级别在任何情况下是否正常工作,当转换为.X
Y
private
Object
Key
如果你想知道决赛,我会将任何东西声明为最终值,哪个值是在实例化时设置的,并且永远不会改变 - 因此是一个对象常量。