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

Java 尽管列表中的所有对象都相等,但List.equals为false,java,list,equals,Java,List,Equals,我有一个对象列表,比如说Article,这是一个非常复杂的嵌套对象。我将省略实际的类,因为它实际上并不重要;知道文章已经实现了equals()(使用AutoValue),这可能很重要 我有两份清单: List<Article> list1 = getSomeArticles(); List<Article> list2 = getOtherArticles(); 这将返回false。 但我检查一下a。两个列表的大小和b相同。索引i中的每个项目在两个列表中都是相等的:

我有一个对象列表,比如说
Article
,这是一个非常复杂的嵌套对象。我将省略实际的类,因为它实际上并不重要;知道
文章
已经实现了
equals()
(使用AutoValue),这可能很重要

我有两份清单:

List<Article> list1 = getSomeArticles(); 
List<Article> list2 = getOtherArticles();
这将返回
false
。 但我检查一下a。两个列表的大小和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
if(list1.size()!=list2.size()){
返回;
}
对于(int i=0;i
两个列表似乎包含完全相同的项,但list1.equals(list2)返回
false


这怎么可能呢?

他们应该是平等的。您的代码有问题。从:

比较指定对象与此列表是否相等。退换商品 当且仅当指定对象也是列表时为true,两个列表 具有相同的大小,且所有对应的两个元素对 名单是平等的。(如果(e1==null,则两个元素e1和e2相等。)? e2==null:e1.equals(e2)))换句话说,两个列表被定义为 如果它们包含相同顺序的相同元素,则表示相等。这 定义确保equals方法在多个应用程序中正常工作 列表接口的不同实现


当然,除非
List
实现覆盖了
java.util.List

@Michael Good catch!“这是一个输入错误。@Michael也解决了这个问题,谢谢。任何合理的
列表
实现都将以与您完全相同的方式实现
等于
——通过迭代元素。您要求我们有效地解释一个悖论,而您的问题更可能的原因是
Article.equals
未正确实现。请提供一个!
getSomeArticles
getOtherArticles
使用了什么
List
实现?不要紧,但我在抓救命稻草。是的,我也这么认为。我会再次检查我的代码(我不能在这里发布完整的原件,因为它是合适的等等)…你能告诉我们使用了什么列表实现吗?
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