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)实现