Java ArrayList包含始终返回false,尽管它包含相同的值

Sha*_*kus 9 java arraylist contain

这是我的孔类

class Hole {

public  int a;
public  int b;

Hole(int a, int b) {
    this.a = a;
    this.b = b;
}
Run Code Online (Sandbox Code Playgroud)

所以我添加了一个包含几个洞的ArrayList

public void checkPathLoop(int x, int y) {
        //rough code

        ArrayList<Hole> leftFlowInnerHole = new ArrayList<>();


        //left holes rules
        leftFlowInnerHole.add(new Hole(0, 1));
        leftFlowInnerHole.add(new Hole(1, 5));
        leftFlowInnerHole.add(new Hole(5, 4));
        leftFlowInnerHole.add(new Hole(0, 4));
Run Code Online (Sandbox Code Playgroud)

当我添加

Hole userInputHole = new Hole(0,1);
System.out.print(leftFlowInnerHole.contain(userInputHole));
Run Code Online (Sandbox Code Playgroud)

它总是返回假!! 它假设返回true.

有什么我想念的吗?

先感谢您

Ale*_* C. 11

你需要覆盖类中的equalsherited方法Object(因此也要hashCode尊重契约,请参阅为什么我需要覆盖Java中的equals和hashCode方法?)Hole.

如果此列表包含指定的元素,则返回true.更正式地说,当且仅当此列表包含至少一个元素e(o==null ? e==null : o.equals(e))时才返回true .

基本上,默认equals实现是==两个对象之间的比较

public boolean equals(Object obj) {
   return (this == obj);
}
Run Code Online (Sandbox Code Playgroud)

由于您创建了两个不同的对象,虽然它们具有与属性相同的值,但它们是两个区分对象并因此this == obj返回false.

如果你这样做:

Hole a = new Hole(0,1);
leftFlowInnerHole.add(a);
System.out.print(leftFlowInnerHole.contains(a));
Run Code Online (Sandbox Code Playgroud)

你会看到它输出true.


Jam*_*SSI 5

您应该覆盖 Hole 类的 equals 方法:

@Override
public boolean equals(Object obj) {

if (obj == this) {
    return true;
}

if (!(obj instanceof Hole)) {
    return false;
}

Hole other = (Hole) obj;

return a == other.a && b == other.b;
}
Run Code Online (Sandbox Code Playgroud)