比较LinkedList.contains()中的对象

时间:2009-02-14 21:09:00

标签: java linked-list contains equality

我希望能够让LinkedList.contains()为自定义比较器返回true。

假设我有1个LinkedList和2个对象

LinkedList<MyObject> myList = new LinkedList<MyObject>();

MyObject a = new MyObject("HELLO");
MyObject b = new MyObject("HELLO");

技术上,两个对象在比较方面是相同的(MyObject实现Comparable)

(a == b)== true

但是,当我执行以下操作时,myList不会为myList.contains返回true(b)

myList.add(a)
myList.contains(b) // == false

我认为它因为包含将检查对象引用并且看到a和b是2个不同的对象。 我有什么方法可以做到这一点所以我不必扩展LinkedList来比较这些对象吗?

6 个答案:

答案 0 :(得分:26)

LinkedList使用equals方法,而不是Comparable.compareTo。您应该在MyObject中override equals (and hashCode)来解决问题。

答案 1 :(得分:3)

contains()方法使用equals()来确定对象是否在列表中。我怀疑您的课程MyObject没有覆盖equals()方法,这就是myList.contains(b)返回false的原因。

答案 2 :(得分:3)

你需要覆盖MyObject类中的.equals(Oject)和.hashCode()方法(List不需要hashCode ......但是当你覆盖equals时,你必须覆盖hashCode)

包含的基本内容是:

for(each item in the list)
{
    if(theCurrentItem.equals(theItemYouAreLookingFor))
    {
        return (true);
    }
}

return (false);

查看Object(for equals和hashCode)here

的文档

另一本非常好的书是Effective Java

答案 3 :(得分:2)

( a == b ) == true

您的意思是a.equals(b)b.equals(a)返回true吗?这与检查引用相等性不一样,也不检查a.compareTo(b) == 0

LinkedList.contains()使用equals(),因此您必须确保该方法为implemented correctlyequals()也应与compareTo()保持一致,但这并非绝对必要。如果您使用的是基于哈希的数据结构(例如HashSet),则必须确保hashCode()implemented correctly

答案 4 :(得分:2)

contains方法的文档如下:

  

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

因此,您需要覆盖MyObject的equals(Object o)方法。

所以对你的例子来说:

public class MyObject {
  String myVal;

  public boolean equals(Object o ) {
    return ((MyObject)o).myVal.equals(myVal);
  }
}

您无需使用Comparable接口实现任何功能。

答案 5 :(得分:1)

您是否考虑过使用新的HashSet(Comparator),而不是使用LinkedList搜索每个元素。这将有效地比较元素以找到匹配。