簡體   English   中英

兩個不同列表實現的equals()方法比較

[英]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<>(); 代替。

ArrayListLinkedList都是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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM