java:Object1& Object2与Object2相同Object1

时间:2012-07-21 22:01:54

标签: java unique hashcode

我尝试在不同的GridPositions(x,y)之间绘制线条。每个GridPos都有4个连接北,东,南,西。问题是,如果我从GridPos(1,1)到GridPos(2,2)绘制一条线,程序将在GridPos(2,2)和GridPos(1,1)之后的相反方向绘制一条线。

我试图解决这个类的问题(WarpGate与GridPos相同):

public class GateConnection {

private WarpGate gate1 = null;
private WarpGate gate2 = null;

public GateConnection(WarpGate gate1, WarpGate gate2) {
    super();
    this.gate1 = gate1;
    this.gate2 = gate2;
}

@Override
public int hashCode() {
    final int prime = 31;

    int result = prime * ((gate1 == null) ? 0 : gate1.hashCode());
    result += prime * ((gate2 == null) ? 0 : gate2.hashCode());
    return result;
}

@Override
public boolean equals(Object obj) {
    if (this == obj) {
        return true;
    }
    if (obj == null) {
        return false;
    }
    if (getClass() != obj.getClass()) {
        return false;
    }
    GateConnection other = (GateConnection) obj;
    if ((gate1.equals(other.gate1) || gate1.equals(other.gate2)) && (gate2.equals(other.gate2) || gate2.equals(other.gate1))) {
        return true;
    }
    return false;
}

}

这个类可以添加到一个HashSet中,双重绘画将会消失,但我不知道hashValue是否总是唯一的。

WarpGate的HashCode(由eclipse自动生成):

@Override
public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result + gridX;
    result = prime * result + gridY;
    return result;
}

现在我使用ArrayList。我查看GateConnection是否存在,如果不存在则添加。但是这个版本比使用HashSet需要更多的资源。

修改

白色矩形是绘制的连接,数字是GridPositions(x | y),红色箭头是绘制矩形的两个方向,因为GridPos(2 | 2)与GridPos(4 | 2)连接。 2)和(4 | 2)到(2 | 2) enter image description here

1 个答案:

答案 0 :(得分:2)

TreeSet既不使用hashCode()也不使用equals()。它使用compareTo(),但您应该确保它与equals()一致,以尊重Set语义。

对于HashSet的存储对象的hashCode()必须是唯一的。实际上,如果您需要,您可以为每个项目返回相同的代码,如果正确实施了equals(),它们仍然可以存储而不会丢失任何项目。良好的hashCode()只能提高绩效。

唯一的关键规则是两个相同的项必须生成相同的哈希码。

只要您可以保证gate1gate2在同一个GateConnection对象中永远不相等,您的实现就会很好。如果它们相等,则两个GateConnection对象可能具有不同的哈希码,但报告为相等。如果它们存储在HashSet中,那将导致不可预测的行为。

E.g。 GateConnection((1,1),(1,1))等于 GateConnection((1,1),(7,9))但哈希码不同。