我有List<MyObject> list
并且,我希望利用list.contains()
函数。
此刻似乎不起作用,即列表中的对象匹配,但比较器操作员没有拾取。
我猜我需要在MyObject
中编写自己的比较运算符。这是怎么回事?
答案 0 :(得分:6)
您需要覆盖public boolean equals(Object o)
因为contains
使用它:
boolean contains(Object o)
如果此collection包含指定的元素,则返回true。更正式地说,当且仅当此集合包含至少一个元素e
(o==null ? e==null : o.equals(e))
时才返回true。
有关覆盖equals
的简单而正确的方法的讨论,请参阅How to implement hashCode and equals method。
您需要特别小心覆盖equals(Object o)
,而不是仅仅实施equals(MyObject o)
。
答案 1 :(得分:0)
您必须覆盖equals()
中的MyObject
。
public class MyObject
{
public boolean equals(Object obj)
{
if(this == obj)
return true;
if((obj == null) || (obj.getClass() != this.getClass()))
return false;
// object must be MyObject at this point
MyObject test = (MyObject) obj;
// Compare 'this' MyObject to 'test'
}
public int hashCode()
{
// generate your hash
}
}
答案 2 :(得分:0)
您只需在MyObject类上实现自己的equals和hashcode版本。
默认等于不会检查您在类中定义的属性。这就是你得到错误结果的原因。
答案 3 :(得分:0)
你的班级需要实现equals()。如果你想对对象进行排序,那么实现Comparable接口也很有用。
class MyObject implements Comparable<MyObject> {
public int compareTo(MyObject o) {
// do the compare!
}
public boolean equals(Object o) {
// check equality
}
}
答案 4 :(得分:0)
请注意List的contains方法的文档: List.contains()
它声明它使用 equals 方法来确定相等性,从而确定该元素是否存在于列表中。
另请注意,当您超载等于时,您必须重载 hashCode 。