5

次のようなことをすると気づきました:

ArrayList anArray = new ArrayList();
anArray.add(anArray);

Netbeans 自動コンパイラには問題がないようで、すべてを参照できるようです。これを行うことの悪い副作用はありますか?

4

4 に答える 4

7

ほとんどの場合、何か悪いことが起こるとは思えません。

リストを再帰的に処理している場合に問題が発生し、その場合、スタック オーバーフローが発生します。

于 2013-06-20T18:13:59.010 に答える
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);
        }
    }

}

これは出力されました:

[(このコレクション)]

それ以外は、このようなプログラムを壊す方法を見つけていません。何も問題はないと思います。


@wobblycogs が述べたように、リストで再帰を使用するときは注意が必要ですが、考えてみると、それは実際には特別なケースではありません。これは、このコードがスタックオーバーフローを与える方法と同様に、単なる循環依存です。

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;
    }

}
于 2013-06-20T18:13:47.883 に答える
2

いいえ、これには本質的に問題はありません。

(ただし、指摘したように、そのオブジェクトに対して再帰的な操作を行うと、無限ループに陥る可能性があります。)

于 2013-06-20T18:14:07.617 に答える