java - for循环中创建对象
迷茫
迷茫 2017-04-17 17:42:37
0
11
1528

下面这两种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中的内容有影响吗,还是只是性能上有区别?

迷茫
迷茫

业精于勤,荒于嬉;行成于思,毁于随。

Antworte allen(11)
迷茫

没有影响,只是user变量的作用域不同。
如果需要对循环的最后一个值做特殊处理,用第一种形式;其它我认为用第二种比较好。

巴扎黑

每次循环都新建一个对象,每个对象都是不同的。两种写法没什么区别

大家讲道理

都可以。没什么区别

Peter_Zhu
list<User> users = new ArrayList<User>();
for (int i = 0; i < 10; i++) {
    users.add(new User().setUserId(i).setUserName("segment" + i));
}
左手右手慢动作

个人认为似乎没什么区别..

黄舟

可能第一个性能好一点,但这完全不是java程序员考虑的问题,直观上说,第二个有更好的编码规范和易读性。

迷茫

似乎第一种多创建了一个对象,其余没什么影响

洪涛

记住一个原则吧:变量在需要的时候才声明,才创建。所以:第二种,但区别很小。那些说效率差异的同学,希望有数据支撑,拿出来给大伙看看

洪涛

内容没啥影响吧 就是第一种在for循环结束后user依然指向了一段内存不会被垃圾回收器回收

迷茫

基本没有区别。唯一的差别在于引用计数器的调整时机有点不同而已,但对象始终有被引用,连GC也不会被触发。所以这个真的没什么区别。
在循环体内声明的对象,作用域结束后标记对象会释放引用。而循环体外声明的,会在下次赋值时,才会释放前一个引用。即便没有被容器保存起来,在JAVA的GC机制下,也是没有多大区别的,都在下一次GC之行时才释放对象。

对于代码可读性上考虑,对象尽在循环体内使用就不要在外边声明,作用域大了代码复杂度高的时候就很容易出错。
还是那个原则:需要的时候才创建。

Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!