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

这是我的孔类

class Hole { public int a; public int b; Hole(int a, int b) { this.a = a; this.b = b; } 

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

 public void checkPathLoop(int x, int y) { //rough code ArrayList 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)); 

当我添加

 Hole userInputHole = new Hole(0,1); System.out.print(leftFlowInnerHole.contain(userInputHole)); 

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

有什么我想念的吗?

先感谢您

你需要在Object类中覆盖从Object类中获取的equals方法(因此也是hashCode以遵守契约,请参阅为什么我需要覆盖Java中的equals和hashCode方法? )。

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

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

 public boolean equals(Object obj) { return (this == obj); } 

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

如果你这样做:

 Hole a = new Hole(0,1); leftFlowInnerHole.add(a); System.out.print(leftFlowInnerHole.contains(a)); 

你会看到它输出为true

你应该覆盖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; } 

contains()方法在检查时检查Object上的equal()方法。

你必须使用ovveride equals方法才能使它工作。

public boolean contains(Object o)

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

 Edit: 

如果你没有ovveriding equals方法,那么默认的Object equals方法执行,并且,根据Equals方法的文档

类Object的equals方法实现了对象上最具辨别力的等价关系; 也就是说,对于任何非空引用值x和y, 当且仅当x和y引用同一对象时此方法才返回true(x == y的值为true)。

因此,您的userInputHole == leftFlowInnerHole始终为false,因为它们指向不同的实例。

因此,为了避免默认实现,您只需在类中等于并提供您的实现。

一个有效的equals(Object o)实现