为什么equals在这种情况下返回false?

时间:2015-04-18 19:17:20

标签: java list equals

这是AbstractList.equals()

的默认JDK 8实现
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));
    }

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

e1.hasNext()为false,e2.hasNext()为false,因此整体应返回true。为什么它会返回假?

2 个答案:

答案 0 :(得分:5)

您的代码将空List与具有单个元素的List进行比较,因此当然equals将返回false。

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

答案 1 :(得分:1)

实际上这句话

  

e1.hasNext()为false,e2.hasNext()为false ...

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

list包含一个元素(由于list.add(innerList)),因此其迭代器有一个要迭代的元素,因此e1.hasNext()true。因此e1.hasNext() || e2.hasNext()会产生true,因此!(e1.hasNext() || e2.hasNext())评估为false