下面这两种for循环中新建对象写法有什么区别呢?
第一种:
list<User> users = new ArrayList<User>();
User user = null;
for (int i = 0; i < 10; i++) {
user = new User();
user.setUserId(i);
user.setUserName("segment" + i);
users.add(user);
}
……
第二种:
list<User> users = new ArrayList<User>();
for (int i = 0; i < 10; i++) {
User user = new User();
user.setUserId(i);
user.setUserName("segment" + i);
users.add(user);
}
……
这两种写法对集合users中的内容有影响吗,还是只是性能上有区别?
迷茫2017-04-17 17:44:37
ユーザー変数のスコープが異なるだけで、影響はありません。
ループの最後の値に対して特別な処理を行う必要がある場合は、最初の形式を使用します。それ以外の場合は、2 番目の形式の方が良いと思います。
黄舟2017-04-17 17:44:37
おそらく最初の方がパフォーマンスは優れていますが、これは Java プログラマーがまったく考慮する問題ではありません。直感的に言えば、2 番目の方がコーディング標準と可読性が優れています。
PHP中文网2017-04-17 17:44:37
1 つの原則を覚えておいてください。変数は必要な場合にのみ宣言および作成する必要があります。つまり、2 番目ですが、違いは小さいです。効率に差があると主張する学生は、それを裏付けるデータを入手して、それをみんなに見せたいと考えています
PHP中文网2017-04-17 17:44:37
コンテンツには何の影響もありません。これは、for ループが終了した後も、ガベージ コレクターによってリサイクルされないメモリの一部を指します。
迷茫2017-04-17 17:44:37
基本的には違いはありません。唯一の違いは、参照カウンタの調整タイミングが若干異なることですが、オブジェクトは常に参照され、GC もトリガーされません。したがって、これは実際には違いはありません。
ループ本体で宣言されたオブジェクトの場合、オブジェクトをマークすると、スコープの終了後に参照が解放されます。ただし、ループの外で宣言された場合、前の参照は次の代入まで解放されません。コンテナによって保存されなかったとしても、JAVA の GC メカニズムでは、オブジェクトは次の GC トリップまで解放されません。
コードの可読性を考慮すると、オブジェクトはループ本体内でのみ使用し、スコープ外で宣言しないでください。スコープが大きく、コードが複雑になると、エラーが発生しやすくなります。
原則は同じです: 必要なときに作成します。