比较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搜索每个元素。 这将有效地比较元素以找到匹配。