为什么ArrayList不会覆盖equals()以获得更好的性能?

Zhe*_*lov 14 java arraylist

ArrayListequals从其父类继承实现,AbstractList这不是很有效.

它可以首先检查两个ArrayLists的大小,然后false如果这些大小不同则立即返回.为什么不这样ArrayList做?

Mar*_*oun 7

正如在这个答案中所指出的,这没有完成,因为一些实现具有其size方法的O(n)复杂性,因此这确实是一种降级.

我同意equals在所有列表实现中保持一致可以影响具有O(1)大小复杂度的集合,但是Java开发人员可能认为在需要时更容易插入它而不是在不需要时将其删除(您必须重新实施整个方法!).例如,您可以使用以下内容轻松添加此优化:

public boolean equals(Object o) {
    // here it is
    if (o instanceof List && this.size() != ((List)o).size())
        return false;

    // call the parent equals
    return super.equals(o);
Run Code Online (Sandbox Code Playgroud)

但如果它最初是使用大小检查(在抽象类中)实现的,则必须重新实现整个方法并删除大小检查:

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());
}
Run Code Online (Sandbox Code Playgroud)


Zhe*_*lov 2

最后,决定重写ArrayList.equals()ArrayList.indexOf()做出:https://bugs.openjdk.java.net/browse/JDK-8196340。基准测试显示了明显的性能提升。