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

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

迷茫
迷茫

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

全部回覆(11)
迷茫

沒有影響,只是user變數的作用域不同。
如果需要對循環的最後一個值做特殊處理,用第一種形式;其它我認為用第二種比較好。

巴扎黑

每次循環都新建一個對象,每個對像都是不同的。兩種寫法沒什麼差別

大家讲道理

都可以。沒什麼差別

Peter_Zhu

雷雷

左手右手慢动作

個人認為似乎沒什麼差別..

黄舟

可能第一個表現好一點,但這完全不是java程式設計師考慮的問題,直覺上說,第二個有更好的編碼規格和易讀性。

迷茫

似乎第一種多創建了一個對象,其餘沒什麼影響

洪涛

記住一個原則吧:變數在需要的時候才聲明,才創建。所以:第二種,但差別很小。那些說效率差異的同學,希望有數據支撐,拿出來給大夥看

洪涛

內容沒啥影響吧 就是第一種在for循環結束後user依然指向了一段內存不會被垃圾回收器回收

迷茫

基本上沒有差別。唯一的差異在於引用計數器的調整時機有點不同而已,但物件總是被引用,連GC也不會被觸發。所以這個真的沒什麼差別。
在循環體內聲明的對象,作用域結束後標記對象會釋放引用。而循環體外聲明的,會在下次賦值時,才會釋放前一個引用。即便沒有被容器保存起來,在JAVA的GC機制下,也是沒有太大差別的,都在下一次GC之行時才釋放物件。

對於程式碼可讀性上考慮,物件盡在循環體內使用就不要在外邊聲明,作用域大了程式碼複雜度高的時候就很容易出錯。
還是那個原則:需要的時候才創建。

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板