尽管列表中的所有对象均相等,但List.equals为false

时间:2018-11-15 17:22:53

标签: java list equals

我有一个对象列表,例如Article,这是一个非常复杂的嵌套对象。我将忽略实际的课程,因为这并不重要。重要的是要知道Article已实现equals()(使用AutoValue)。

我有两个列表:

List<Article> list1 = getSomeArticles(); 
List<Article> list2 = getOtherArticles();

现在,我检查它们是否相等:

boolean listsAreEqual = list1.equals(list2); 

这将返回false。 但是我检查是否。两个列表的大小和b相同。索引i中的每个项目在两个列表中均相等:

if (list1.size() != list2.size()) {
  return; 
}

for (int i = 0; i < list1.size(); i++) {
  Article article1 = list1.get(i);
  Article article2 = list2.get(i); 

  if (!article1.equals(article2)) {
    return; 
  }
}

// All items in the two lists are equals, but list2.equals(list2) is false

两个列表似乎都包含完全相同的项目,但是list1.equals(list2)返回false

那怎么可能?

1 个答案:

答案 0 :(得分:1)

它们应该相等。您的代码不正确。来自documentation

  

将指定的对象与此列表进行比较以确保相等。退货   当且仅当指定对象也是列表时,才返回true   具有相同的大小,并且两个中的所有对应元素对   名单是平等的。 (两个元素e1和e2相等,如果(e1 == null?   e2 == null:e1.equals(e2))。换句话说,两个列表被定义为   如果它们包含相同顺序的相同元素,则相等。这个   定义可确保equals方法可跨   List接口的不同实现。

当然,除非List实现会覆盖java.util.List中的默认设置。