这是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。为什么它会返回假?
答案 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
。