[英]Why equals return false in this situation?
这是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。 我的问题是为什么? 在最后一行返回!(e1.hasNext()|| e2.hasNext());
e1.hasNext()为false,e2.hasNext()为false,因此总的来说应该返回true。 为什么返回假?
您的代码将空列表与具有单个元素的列表进行比较,因此equals
将返回false。
return !(e1.hasNext() || e2.hasNext());
计算return !(true || false);
(因为一个List为空,而另一个List不为空),结果return !true
,它为false。
实际上这句话
e1.hasNext()为false和e2.hasNext()为false ...
是不正确的。 原因如下:e1是list
上的迭代器,e2是innerList
的迭代器。
list
包含一个元素(由于list.add(innerList)
),因此其迭代器具有一个要迭代的元素,因此e1.hasNext()
为true
。 因此e1.hasNext() || e2.hasNext()
e1.hasNext() || e2.hasNext()
得出true
,因此!(e1.hasNext() || e2.hasNext())
false
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.