如果数组(列表)包含自身,会发生什么不好的事吗?

use*_*072 5 java

我注意到如果我做了类似的事情:

ArrayList anArray = new ArrayList();
anArray.add(anArray);
Run Code Online (Sandbox Code Playgroud)

Netbeans自动编译器似乎没有任何问题,我似乎仍然能够引用一切.这样做有什么不好的副作用吗?

wob*_*ogs 7

我怀疑在大多数情况下会发生什么坏事.

如果你以递归方式处理列表,那么问题就出现了,在这种情况下你最终会出现堆栈溢出.

  • 或者最终*在*Stack Overflow中,询问列表是否可以包含它自己. (19认同)

Dan*_*lan 5

当你打印出来时它会产生一个非常有趣的效果:

package com.sandbox;

import java.util.ArrayList;

public class Sandbox {

    public static void main(String[] args) {
        ArrayList anArray = new ArrayList();
        anArray.add(anArray);

        for (Object o : anArray) {
            System.out.println(o);
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

打印出来的:

[(本集合)]

除此之外,我还没有找到打破这样一个程序的方法.我不认为它有任何问题.


正如@wobblycogs所提到的,当你在列表中使用递归时,你必须要小心,但是当你想到它时,这并不是一个特殊情况.它只是一个循环依赖,类似于此代码给出stackoverflow的方式:

package com.sandbox;

public class Sandbox {

    public static void main(String[] args) {
        A a = new A();
        B b = new B();

        a.b = b;
        b.a = a;


        traverse(a);
    }

    private static void traverse(A a) {
        traverse(a.b);
    }

    private static void traverse(B b) {
        traverse(b.a);
    }


    private static class A {
        private B b;
    }

    private static class B {
        private A a;
    }

}
Run Code Online (Sandbox Code Playgroud)