簡體   English   中英

AbstractList :: equals()的JDK實現不首先檢查列表大小相等

[英]JDK implementation of AbstractList::equals() does not check for list size equality first

奇怪的是,如果兩個列表具有相同的大小 ,則AbstractList::equals()的默認JDK 6實現似乎不首先檢查

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

如果兩個列表都包含大量項目或需要時間進行比較的項目,則會在意識到一個列表比另一個列表短之前對它們進行比較; 這對我來說似乎真的很低效,因為即使沒有調用一個比較也可以做到平等。

特別是對於許多情況,列表大小在大多數情況下會有所不同。 此外,大多數Java List實現具有O(1) size()性能(甚至LinkedList,它在緩存中保持其大小)。

這個默認實現有充分的理由嗎?

equals方法的操作詳細說明,它需要O(n)行為。 雖然這對於大小方法為O(1)的子類來說可能不是最理想的,但對於某些子類,size方法本身可能是O(n),並且請求的行為實際上會降級。 無論如何,規范是明確的,並且無法進行此更改。

請注意,如果需要,子類可以重寫equals,在適當時插入大小比較。

參考。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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