为什么在这种情况下等于 return false?

Why equals return false in this situation?

这里是默认的JDK8实现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());
}

我有以下代码:

public static void main(String[] args) {

        List list = new LinkedList<List>();
        List innerList = new LinkedList<List>();
        list.add(innerList);

        System.out.println(list.equals(innerList));
    }

在我看来,这里的两个列表不相等,应该 return 错误。并且编译器 return 错误。我的问题是为什么?在最后一行 return !(e1.hasNext() || e2.hasNext());

e1.hasNext() 是假的,e2.hasNext() 是假的,所以总的来说它应该 return 是真的。为什么 return 错误?

您的代码将空列表与具有单个元素的列表进行比较,因此 equals 当然会 return 错误。

return !(e1.hasNext() || e2.hasNext()); 的计算结果为 return !(true || false);(因为一个 List 为空而另一个不为空)计算结果为 return !true,这是错误的。

其实就是这句话

e1.hasNext() is false and e2.hasNext() is false ...

不正确。原因如下:e1 是 list 上的迭代器,e2 是 innerList.

上的迭代器

list 包含一个元素(由于 list.add(innerList))所以它的迭代器有一个要迭代的元素所以 e1.hasNext()true。因此 e1.hasNext() || e2.hasNext() 产生 true,因此 !(e1.hasNext() || e2.hasNext()) 计算为 false