空列表等于空列表

时间:2019-04-03 09:58:10

标签: java

我有一个空的Stings列表,还有一个空的Integers列表。这些列表在Java中似乎是相等的。我很好奇为什么会这样,因为列表只能包含不同对象的元素。

List<String> strings = new ArrayList<String>();
List<Integer> ints = new ArrayList<Integer>();
boolean compareLists = strings.equals(ints);

在这种情况下为什么compareLists是正确的?

4 个答案:

答案 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: []

因此,如果[]等于[],则“比较列表”进行比较。没错!

因此,在这种情况下,“比较列表”布尔值是正确的,因为它们相等。一旦任何列表获得记录,那么“比较列表”布尔值将不再相等!