比较LinkedList.contains()中的对象

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

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

LinkedList myList = new LinkedList(); 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来比较这些对象?

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

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

您需要覆盖MyObject类中的.equals(Oject)和.hashCode()方法(List不需要hashCode …但是当您覆盖equals时,合同表示您必须覆盖hashCode)。

基本上包含的内容是:

 for(列表中的每个项目)
 {
    如果(theCurrentItem.equals(theItemYouAreLookingFor))
     {
         return(true);
     }
 }

返回(假);

在这里查看Object(for equals和hashCode)的文档

另外一本非常好的书是Effective Java

 ( a == b ) == true 

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

LinkedList.contains()使用equals() ,因此您必须确保该方法已正确实现 。 equals()也应该与compareTo()一致,尽管这不是绝对必要的。 如果您使用的是基于散列的数据结构(例如HashSet ),则必须确保正确实现 hashCode()

contains方法的文档如下:

如果此collection包含指定的元素,则返回true。 更正式地,当且仅当此集合包含至少一个元素e时才返回true(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接口实现任何内容。

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