Java 将一个数组列表添加到另一个数组列表时出现StackOverflow异常

Java 将一个数组列表添加到另一个数组列表时出现StackOverflow异常,java,stack-overflow,Java,Stack Overflow,我在执行下面的代码时得到了java.lang.StackOverflowerError public class Insertion { private static ArrayList integers1 = new ArrayList(); private static ArrayList integers2 = new ArrayList(); public static void main(String[] args) { Collections

我在执行下面的代码时得到了
java.lang.StackOverflowerError

public class Insertion {
    private static ArrayList integers1 = new ArrayList();
    private static ArrayList integers2 = new ArrayList();

    public static void main(String[] args) {
        Collections.addAll(integers1, 1, 2, 3);
        Collections.addAll(integers2, 5, 6, 7);

        integers1.add(integers2);
        System.out.println(integers1);
        integers2.add(integers1);
        System.out.println(integers2);
    }
}

请解释原因?

当您尝试打印列表时,堆栈溢出正在发生。
您有两个列表:
integers1=[1,2,3,integers2]
integers2=[5,6,7,integers1]

当您尝试打印
整数2
时,实际上打印:

[1,2,3,integers1.toString()]
integers1.toString()
[5,6,7,integers2.toString()]
,它依次调用
integers1.toString()
。这将导致无限循环,该循环仅在堆栈溢出时结束

此打印的理论结果将是
[1,2,3,5,6,7,1,2,3,5,6,7,…(无限重复)]
,这是通过递归完成的-但在某些时候,堆栈已满,程序中断。

在这一行中:

integers1.add(integers2);
您正在将整个数组列表添加到另一个数组列表中。当你这样做的时候:

integers2.add(integers1);
您可以创建一个循环引用。Boom-尝试打印时发生异常

如果使用泛型,就不会发生这种情况。我假设您只想在列表中保留整数,因此此声明将导致您的代码无法编译:

private static ArrayList<Integer> integers1 = new ArrayList<>();
private static ArrayList<Integer> integers2 = new ArrayList<>();

// ...

// The method add(Integer) in the type ArrayList<Integer> is not applicable 
// for the arguments (ArrayList<Integer>)
integers1.add(integers2); 

private static ArrayList integers1=new ArrayList();

私有静态ArrayList integers2=新ArrayList(); // ... //类型ArrayList中的方法add(Integer)不适用 //用于参数(ArrayList) 整数1.加法(整数2);
对于无限循环和堆栈溢出,您已经得到了很好的解释

现在,假设这个循环引用不是您的意图,您可能希望将一个列表的元素添加到另一个列表中。这是通过
addAll
完成的:

integers1.addAll(integers2);
integers2.addAll(integers1);

处理无法解释的异常时,始终提供完整的堆栈跟踪。显示print语句的输出也可能有帮助。private static ArrayList integers1=new ArrayList();这是Java中的一种老式编程方式。您希望看到什么
integers1.add(integers2)要做什么?将
integers2
中的每个元素添加到
integers1
(提示:它不会这样做)?这可能是一个面试问题。“执行此代码时会发生什么?”。+1这很好地描述了无限循环是如何展开的。@Duncan Man我刚才在这里强调的是一个重大事件——循环参考点!