两个不同列表实现的equals()方法比较

时间:2017-11-15 13:07:25

标签: java

以下是比较两个不同列表实现的程序。当我运行它时,结果是 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));
    }
}

3 个答案:

答案 0 :(得分:5)

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

  

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

旁注:您在撰写List listA = new ArrayList<>();时使用的是原始类型 - 您应该使用类似List<Object> listA = new ArrayList<>();的内容。

答案 1 :(得分:3)

ArrayListLinkedList都是AbstractList个。来自documentation

  

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

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

答案 2 :(得分:0)

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

管理

以下是{JD} 1.8实施ArrayList

的摘录
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());
}

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

的实现,它将返回List