以下是比较两个不同列表实现的程序。当我运行它时,结果是 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));
}
}
答案 0 :(得分:5)
当您对特定方法有疑问时,最好的起点是the javadoc - 摘录:
换句话说,如果两个列表包含相同顺序的相同元素,则它们被定义为相等。此定义确保equals方法在List接口的不同实现中正常工作。
旁注:您在撰写List listA = new ArrayList<>();
时使用的是原始类型 - 您应该使用类似List<Object> listA = new ArrayList<>();
的内容。
答案 1 :(得分:3)
ArrayList
和LinkedList
都是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