私の悪い例のためにこの質問を編集しました..これが私の更新された質問です:
以下は、速度とメモリ割り当てが同じですか。
int b;
for (int i = 0; i < 1000; i++)
b = i;
と
for (int i = 0; i < 1000; i++)
int b = i;
いいえ、そうではありません。
最初のケースでは、1 つの変数に 1000 個の異なる値が割り当てられ、コンストラクターの完了後に最後の値 (999) を取得できるようになります。
2 番目のケースでは、基本的にノーオペレーション メソッドを 1000 回呼び出しています。2 番目のメソッドには副作用がなく、戻り値がないため、役に立ちません。ローカル変数は、メソッド呼び出しの間のみ「存在」しますが、最初の例のインスタンス変数はオブジェクトの一部であるため、存続します。
これはプリミティブに限定されないことに注意してください。他のタイプも同じように動作します。
いいえ。
Class1
変数にa
は、クラスのすべてのメソッドからアクセスできるフィールドがあります。Class2
は当てはまりません:a
メソッド内のローカル変数ですassign
。終了後assign
、 の値a
は破棄されます。いいえ、1 つはインスタンス変数a
(Class1) を持ち、もう 1 つは持っていません。
注目に値するのは、その価値のあるコンパイラーであり、JIT が多くの塩の価値があると固く信じていることです。
これを試してみましたか?それはコンパイルさえしません!
for (int i = 0; i < 1000; i++)
int b = i;
コンパイラからのエラー メッセージ:
Example.java:4: '.class' expected
int b = i;
^
Example.java:4: not a statement
int b = i;
^
Example.java:4: illegal start of expression
int b = i;
^
ループの本体には、少なくとも 1 つのステートメントが含まれている必要があります。変数宣言はステートメントではないため、変数宣言だけのループは無効です。