[英]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.