我在接受采访时问这个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");
}
为什么结果不平等' ?谢谢!
答案 0 :(得分:3)
您的代码(编辑后)会产生StackOverflowException
,因为a
包含自身且b
包含自身。
a.equals(b)
将并行迭代列表并比较每个元素,因此a.get(0).equals(b.get(0))
,a.get(0)
为a
,b.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
有两个元素(a
和b
),而不是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