我想比较两个列表。因为我们使用List
编码接口,而equals
不从Object类继承{{1}}。我该怎么做?
答案 0 :(得分:14)
即使List
接口不包含equals
方法,列表类仍然可以(并且确实)实现equals
方法。
来自API docs on AbstractList
(由例如ArrayList
,LinkedList
,Vector
继承):
<强>
public boolean equals(Object o)
强>
将指定对象与此列表进行相等性比较。当且仅当指定的对象也是列表时,返回true,两个列表具有相同的大小,并且两个列表中所有对应的元素对相等。
同样适用于toString
,hashCode
方法等。
正如@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