我有一个空的Stings列表,还有一个空的Integers列表。这些列表在Java中似乎是相等的。我很好奇为什么会这样,因为列表只能包含不同对象的元素。
List<String> strings = new ArrayList<String>();
List<Integer> ints = new ArrayList<Integer>();
boolean compareLists = strings.equals(ints);
在这种情况下为什么compareLists
是正确的?
答案 0 :(得分:3)
请参阅AbstractList.equals(Object o)
的文档:
将指定的对象与此列表进行比较以确保相等。当且仅当指定对象也是一个列表,并且两个列表具有相同的大小,并且两个列表中所有对应的元素对相等时,才返回true。
您要传递的对象是列表,两个列表的大小相同(在这种情况下为0),并且所有对应的元素对(都不存在)相等。
所有条件都得到满足,因此该方法返回true
编辑:
正如@Smutje所说,泛型类型在编译时被擦除,因此在运行时不存在。
换句话说,列表的“类型”不相关。
答案 1 :(得分:0)
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());
}
这是ArrayList的相等代码。这意味着如果两个列表都为空,则将评估最后一个条件,结果为true。
答案 2 :(得分:0)
当列表具有相同的长度并且所有元素(在它们各自的位置)都相等时,列表是相等的。
所有空列表都是这种情况。
答案 3 :(得分:0)
由于任何列表中都没有数据,因此列表如下:
strings: []
ints: []
因此,如果[]等于[],则“比较列表”进行比较。没错!
因此,在这种情况下,“比较列表”布尔值是正确的,因为它们相等。一旦任何列表获得记录,那么“比较列表”布尔值将不再相等!