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

Java 两种不同列表实现的equals()方法比较,java,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 list

下面是比较两种不同列表实现的程序。当我运行此命令时,结果会得到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));
    }
}
package.com.tests;
导入java.util.ArrayList;
导入java.util.LinkedList;
导入java.util.List;
公共类列表{
公共静态void main(字符串[]args){
List listA=new ArrayList();
List listB=新链接列表();
对象=新对象();
整数=新整数(4);
添加(对象);
添加(对象);
System.out.println(listA.equals(listB));
}
}

当您对特定方法有疑问时,最好从-extract开始:

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


旁注:您在编写
List listA=new ArrayList()时使用的是原始类型-您应该使用类似于
List listA=new ArrayList()的内容相反。

ArrayList
LinkedList
都是
AbstractList
s。从:

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


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

此处
.equals()
方法的行为将由实现
列表
接口的类(在您的示例中是
ArrayList
类)控制

以下是Oracle JDK 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());
}
公共布尔等于(对象o){
如果(o==这个)
返回true;
如果(!(列表实例))
返回false;
ListIterator e1=ListIterator();
ListIterator e2=((List)o).ListIterator();
而(e1.hasNext()&&e2.hasNext()){
eo1=e1.next();
对象o2=e2.next();
如果(!(o1==null?o2==null:o1.equals(o2)))
返回false;
}
返回!(e1.hasNext()| e2.hasNext());
}

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

的实现,它将返回
false
,您可能希望在一个列表中添加
integer
。。。不同的
对象对象=新对象()。。。除非这不是你所尝试的。。。但是,如果你想问一个问题就好了。请检查以下内容: