下面这两种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
基本上沒有差別。唯一的差異在於引用計數器的調整時機有點不同而已,但物件總是被引用,連GC也不會被觸發。所以這個真的沒什麼差別。
在循環體內聲明的對象,作用域結束後標記對象會釋放引用。而循環體外聲明的,會在下次賦值時,才會釋放前一個引用。即便沒有被容器保存起來,在JAVA的GC機制下,也是沒有太大差別的,都在下一次GC之行時才釋放物件。
對於程式碼可讀性上考慮,物件盡在循環體內使用就不要在外邊聲明,作用域大了程式碼複雜度高的時候就很容易出錯。
還是那個原則:需要的時候才創建。