为什么这两个名单不相等?

时间:2015-08-21 15:57:22

标签: java list equals

我在接受采访时问这个java问题:

    List a = new ArrayList();
    a.add(a);

    List b = new ArrayList();
    b.add(b);

    if (a.equals(b)) {
        System.out.println("equal");
    } else {
        System.out.println("non-equal");
    }

为什么结果不平等' ?谢谢!

3 个答案:

答案 0 :(得分:3)

您的代码(编辑后)会产生StackOverflowException,因为a包含自身且b包含自身。

a.equals(b)将并行迭代列表并比较每个元素,因此a.get(0).equals(b.get(0))a.get(0)ab.get(0)b并且比较那些将无限制地递归equals方法。

答案 1 :(得分:2)

List a = new ArrayList();
a.add(a);

List b = new ArrayList();
a.add(b);

仔细看。 a现在有两个项目(a和b),b没有项目。所以a不等于b。

答案 2 :(得分:0)

[在编辑之前对答复的答复]

.equals方法比较两个数组列表的内容。 (如果它们是同一个对象,则不是这样)

如果您在使用方法.add后仔细查看,则列表a有两个元素(ab),而不是b什么都没有

代码没有进入java.lang.StackOverflowError,因为.equals方法首先检查两个列表的大小,然后检查内容。

事实上,如果您尝试此代码:

    List a = new ArrayList();
    a.add(a);
    List b = new ArrayList();
    b.add(b); // <-watch carefully here. Now a and b are of the same size
    if (a.equals(b)) { // checks the size first, then the objects in the lists
        System.out.println("equal");
    } else {
        System.out.println("non-equal");
    }

你得到java.lang.StackOverflowError