比较两个列表

时间:2010-05-22 21:40:02

标签: java collections

我想比较两个列表。因为我们使用List编码接口,而equals不从Object类继承{{1}}。我该怎么做?

3 个答案:

答案 0 :(得分:14)

即使List接口不包含equals方法,列表类仍然可以(并且确实)实现equals方法。

来自API docs on AbstractList(由例如ArrayListLinkedListVector继承):

  

<强> public boolean equals(Object o)

     
将指定对象与此列表进行相等性比较。当且仅当指定的对象也是列表时,返回true,两个列表具有相同的大小,并且两个列表中所有对应的元素对相等。

同样适用于toStringhashCode方法等。


正如@Pascal在评论中提到的那样,List接口提到了equals方法,并在文档中说明了以下内容:

  

List接口在迭代器,add,remove,equals和hashCode方法的契约上放置了除Collection接口中指定的规则之外的其他规定。

答案 1 :(得分:2)

您仍然可以使用equals。所有对象都实现它,您的列表仍然是对象,并根据需要覆盖equals

答案 2 :(得分:0)

这是通常的故事:你必须考虑“浅层平等”和“深度平等”。

从java.lang.Object中获取的默认行为是“浅等于”。它将检查list1和list2是否是相同的引用:

List list1 = new ArrayList();
List list2 = list1;

list1.equals(list2); // returns true;

如果你想要“深度等于”,则实例化任何扩展AbstractList的东西,比如ArrayList。

List<String> list1 = new ArrayList<>();
List<String> list2 = new ArrayList<>();

list1.add("hello");
list2.add("hello");
System.out.println(list1.equals(list2)); // will print true

list1.add("foo");
list2.add("bar");
System.out.println(list1.equals(list2)); // will print false