首页 > 解决方案 > Java equals 方法无法按预期工作

问题描述

pieces 实例是一个包含类 Piece 的列表。Piece 对象包含两个实例变量,类似于坐标 int x 和 int y。但是,当我尝试这些方法时,如果参数piece 已经在pieces 对象中,则第二种方法不会返回true。我在 Piece 类上生成了一个相等的方法。不知道为什么第二种方法不起作用。

 public boolean alreadyContainsCoordinate1(Piece piece) {
        for (int i = 0; i < getLength(); i++) {
            if (pieces.get(i).getX() == piece.getX() && pieces.get(i).getY() == piece.getY()) {
                return true;
            }
        }

        return false;
    }

    public boolean alreadyContainsThisCoordinate2(Piece piece) {
         for (Piece body : pieces) {
            if (body.equals(piece)) {
                return true;
            }
        }
        return false; 
    }

标签: javalistarraylistequals

解决方案


您的第二种alreadyContainsThisCoordinate2()方法可能是使用equals()对象的默认方法,它比较引用,而不是特定对象的内容。您可以尝试equals如下覆盖:

@Override
public boolean equals(Object o) {
    if (!(o instanceof Piece)) {
        return false;
    }

    Piece p = (Piece)o;
    return this.getX() == p.getX() && this.getY() == p.getY();
}

推荐阅读