2

重複の可能性:
ループの前またはループ内で変数を宣言することの違いは?

String str;
for (int i = 0; i < 10; i++) {
    str = "Hello, World"; // Is str created only 1 time?
}

上と下の違いは何ですか?そして、それらが異なる場合、どちらが優れていますか?

for (int i = 0; i < 10; i++) {
    String str = "Hello, World"; // Is str created 10 times?
}
4

7 に答える 7

3

最初の例では、変数はforループの範囲外で使用できますが、もう1つの変数はforループ内に表示されます

于 2012-12-23T19:24:15.427 に答える
2

違いは、最初の例のループのstrで変数にアクセスできることです。

範囲:

変数のスコープは異なります。

  • ループの外側で定義された変数は、ループの内側を含め、宣言(および初期化)された後のメソッドのどこからでもアクセスできます。
  • ループ内で定義された変数は、ループでのみアクセス可能です

初期化:

ループが繰り返されない可能性がある場合、最初の例では変数が初期化されないため、値を指定するまでループの後で使用できません(その値がnull

ガベージコレクション:

ガベージコレクションに使用できるポイントは次のとおりです。

  1. メソッド内で最後に使用した後、たとえば1
  2. ループの終わり、たとえば2
于 2012-12-23T19:23:52.510 に答える
2

基本的にシングルトン定数である文字列リテラルを使用して例を記述しなかった場合、答えはどちらの場合も10個のオブジェクトが作成されるということです。特定の例では、オブジェクトは作成されません

于 2012-12-23T19:26:05.693 に答える
1

文字列リテラルなので、10回は作成されません。ヒープスペースではなく、permgenスペースに保存されます。

于 2012-12-23T19:26:40.123 に答える
0

Javaでは、文字列定数はインターンされます。つまり、同じ文字列リテラルが(PermGen)メモリに1回だけ保持されます。たとえば、次のようになります。

"foo" == "foo"

間違いなく真実です。したがって、両方のスニペットのメモリフットプリントは等しくなりますが、最初のスニペットではstr、ループの終了後に使用できます。

strどちらが優れているかは、ループ後に何をする必要があるかによって異なります。

乾杯、

于 2012-12-23T19:26:29.233 に答える
0

メンテナンスの観点からは、2番目の方が優れています。可能な限り狭い範囲で、同じ場所で変数を宣言して初期化します。宣言と初期化の間にギャップのある穴を残したり、必要のない名前空間を汚染したりしないでください。

このリンクを参照してください

于 2012-12-23T19:27:55.397 に答える
0

前者の場合、ループに対してグローバルな変数は、参照が参照される値で10回初期化されますが、後者の場合、ループに対してローカルな変数は、同じ値で10回再初期化されます。

注:変数は1つだけで、どちらの場合も10ではありません

複数の変数を初期化する目的で、配列、ベクトル、またはリンクリストを使用することをお勧めします

于 2012-12-23T19:46:31.963 に答える