【问题标题】:equals() method comparison for two different list implementations两个不同列表实现的 equals() 方法比较
【发布时间】:2018-04-28 17:25:15
【问题描述】:

下面是比较两个不同列表实现的程序。当我运行它时,得到 true 结果。

我想了解这个 equals() 方法在这种情况下的行为。

package com.tests;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

public class ListsTest {
    public static void main(String[] args) {
        List listA = new ArrayList<>();
        List listB = new LinkedList<>();
        Object object = new Object();
        Integer integer = new Integer(4);
        listA.add(object);
        listB.add(object);
        System.out.println(listA.equals(listB));
    }
}

【问题讨论】:

  • 您可能想在一个列表中添加integer...不一样的Object object = new Object();...除非这不是您尝试过的...但是如果您想问一下就好了一个问题。

标签: java


【解决方案1】:

当您对特定方法有疑问时,最好的起点是the javadoc - 摘录:

换句话说,如果两个列表以相同的顺序包含相同的元素,则它们被定义为相等。此定义可确保 equals 方法在 List 接口的不同实现中正常工作。

旁注:您在编写 List listA = new ArrayList&lt;&gt;(); 时使用的是原始类型 - 您应该改用 List&lt;Object&gt; listA = new ArrayList&lt;&gt;(); 之类的东西。

【讨论】:

    【解决方案2】:

    ArrayListLinkedList 都是 AbstractLists。来自documentation

    当且仅当指定对象也是一个列表,两个列表具有相同的大小,并且两个列表中所有对应的元素对都相等时,才返回 true。

    您的两个列表都包含一个元素 - 变量 object,因此它们都是相同的,因为它们都是列表。

    【讨论】:

      【解决方案3】:

      此处.equals() 方法的行为将由实现List 接口的类(在您的情况下为ArrayList 类)控制

      以下是来自ArrayList 的 Oracle JDK 1.8 实现的 sn-p:

      public boolean equals(Object o) {
          if (o == this)
              return true;
          if (!(o instanceof List))
              return false;
      
          ListIterator<E> e1 = listIterator();
          ListIterator<?> e2 = ((List<?>) o).listIterator();
          while (e1.hasNext() && e2.hasNext()) {
              E o1 = e1.next();
              Object o2 = e2.next();
              if (!(o1==null ? o2==null : o1.equals(o2)))
                  return false;
          }
          return !(e1.hasNext() || e2.hasNext());
      }
      

      从这里可以明显看出,对于任何实现了List 接口的对象,如果列表的内容与当前对象相同,或者两者都指向同一个对象,该方法将返回true。如果传递的对象不是List的实现,它将返回false

      【讨论】:

        猜你喜欢
        • 2012-01-15
        • 2016-05-25
        • 1970-01-01
        • 1970-01-01
        • 2017-07-28
        • 1970-01-01
        • 1970-01-01
        • 2011-04-26
        • 1970-01-01
        相关资源
        最近更新 更多