![](/img/trans.png)
[英]Google Guava / Equivalence / different equals() and hashCode() method implementations
[英]equals() method comparison for two different list implementations
下面是比較兩個不同列表實現的程序。 當我運行此命令時,結果變為真實 。
在這種情況下,我想了解此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));
}
}
當您對特定方法有疑問時,最好的起點是javadoc -extract:
換句話說,如果兩個列表包含相同順序的相同元素,則定義為相等。 此定義確保equals方法可在List接口的不同實現中正常工作。
List listA = new ArrayList<>();
編寫List listA = new ArrayList<>();
時,您正在使用原始類型List listA = new ArrayList<>();
-您應該使用類似List<Object> listA = new ArrayList<>();
代替。
ArrayList
和LinkedList
都是AbstractList
。 從文檔中 :
當且僅當指定對象也是一個列表,並且兩個列表具有相同的大小,並且兩個列表中所有對應的元素對相等時,才返回true。
您的兩個列表都包含一個元素-變量object
,因此它們與兩個列表相同。
.equals()
方法的行為將由實現List
接口的類(在您的情況下為ArrayList
類)控制。
以下是ArrayList
的Oracle JDK 1.8實現的摘錄:
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
的內容與當前對象相同,或者兩者都指向同一對象。 如果傳遞的對象不是List
的實現,則它將返回false
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.