为什么在这种情况下等于 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
。
这里是默认的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
。