9

この質問が言語に依存しないかどうかわからないので、Java の質問として質問します。次のようなループがある場合

for (int i = 0; i < 9; i++) {
    Object obj = new Object;
    // fill object
    // do something with data
}

ループの反復ごとにメモリ内に新しいスペースが作成されていますか? もしそうなら、古いスペースは処分されていますか?そうでない場合、このようなことを行う方が効率的ですか

Object obj = new Object;
for (int i = 0; i < 9; i++) {
    // fill object
    // do something with data
}

編集:質問をよりよく例示するためにコードを更新しました

4

3 に答える 3

9

簡単な答え: Java での開発中は、これらの問題のほとんどがブラック ボックス化され、JVM 自体によって管理されている場合でも、そのようなことは無視してください。

ガベージ コレクターは何をすべきかを知っており、状況に応じて最善のことをしようとします。

さらに、あなたの特定の例は私にはあまり意味がありません..さらに詳しく説明していただけますか?

于 2012-04-22T22:52:13.010 に答える
7

「ガベージ コレクターに任せる」という基本的な答えは正しいですが、次の 2 つのステートメントの影響も理解する必要があります。

String object = new String();
object = array[i];

(1)新しい(空の)文字列を作成し、それを「オブジェクト」に割り当て、次に(2)の値array[i]を「オブジェクト」に割り当てます。

(2) の代入は (1) で行ったことを上書きするため、最初に作成した文字列は使用されません。ガベージ コレクターは最終的にストレージを再利用するため、ストレージが失われることを心配する必要はありませんが、それでも不必要な割り当てです。あなたはただ始めることができますString object = null;

また、Strings は Java では不変であるため、一度Stringオブジェクトを割り当てると、その値を変更できないことに注意してください。String変数に新しいオブジェクトを参照させることはできますが、既存のオブジェクトを変更することはできません。

于 2012-04-22T23:04:07.357 に答える
1

いくつかのテストを実行して結果を見てみませんか? ガベージ コレクターが機能するのは事実ですが、それが最適に機能するかどうかはわかりません。膨大な量のデータを扱う場合、この種のことは効率に影響を与える可能性があります。

このリンクは、必要なものを追跡するのに役立つと思います。

于 2012-04-22T23:01:28.853 に答える