0

私はここでコンセプトに苦労していますが、実際には特定のコードではありません。私は誤解されているように感じ、それを理解しようとしています。

サンプルコードは次のとおりです。

List myList = new ArrayList<String>();

for (int i=1; i<11; i++) {
    Foo myObject = new Foo();
    myList.add(myObject.Bar)
}

その全体myListへの参照が含まれているため、範囲外になるまでGCの対象にならないと言われました。やったらと言われましたmyObject.BarmyObjectmyList

List myList = new ArrayList<String>();

for (int i=1; i<11; i++) {
    Foo myObject = new Foo();
    myList.add(new String(myObject.Bar))
}

代わりに、myObject「強く参照」されていないため、GC の対象になります。

正しくないようですが、誰か説明してもらえますか?

Java は私の母国語ではありません。

4

2 に答える 2

5

あなたは本当に次のようなことを意味していたと思います:

Foo myObject = new Foo();
myList.add(myObject.bar);

いいえ、あなたは誤解されています。Foo.barそれ自体に「所有」への参照が含まれていない限りFoo(それが本当に単なる文字列である場合はそうではありません)、新しく作成されたFooインスタンスがガベージ コレクションされるのを防ぐことはできません。あなたを誤解させた人物と個人的に連絡を取り合っている場合は、その人物に詳細を尋ねることをお勧めします。次の 3 つのオプションのいずれかが表示されます。

  • 彼らは状況を誤解していたのかもしれません。
  • あなたが説明したような状況ではないかもしれません。たとえば、次のようなことについて話している可能性があります。

    String longString = getLongString();
    myList.add(longString.substring(0, 4));
    

    ...元の「大量の文字データ」をガベージコレクションできるかどうかは、実装によって異なります。

  • 彼らは単にガベージ コレクションを誤解している可能性があります。
于 2013-03-07T05:41:11.767 に答える
0

コードが正しく、そのように意図したと仮定すると、以下のコードでは、実行全体を通じて参照 myObject が null に設定されないため、オブジェクトが失われることはありません。したがって、ガベージ コレクションを行うことはできません。

List myList = new ArrayList<String>();

for (int i=1; i<11; i++) {
    Foo myObject = new Foo();
    myList.add(new String(Foo.Bar))
}

For ループが終了した後でのみ、オブジェクトはスコープ外になり、ガベージ コレクトされます。

于 2013-03-07T05:46:14.827 に答える