奇怪的是,JDK 6 默认实现的 AbstractList::equals()
方法似乎没有首先检查两个列表是否具有相同大小:
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也是如此,它将其大小保留在缓存中)。
这种默认实现是否有充分的理由?