亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

關于循環內創建對象的寫法

關于循環內創建對象的寫法

慕妹3146593 2019-03-01 10:32:46
今天遇到一個關于for循環內對象的寫法問題 一種是: for (condition){ Object obj = new Object(); //handle obj } 第二種是 Object obj = null; for (condition){ obj = new Object(); //handle obj } 我想了解一下這兩種的寫法的一個區別工作中經常見到的是第一種的寫法。個人見解是第一種創建了更多的對象,第二種只是引用的對象變了。覺得第二種寫法更好。但公司那么多比我經驗豐富的都寫第一種。我想知道的是這兩種寫法的區別是否可以忽略不計?沒有什么影響
查看完整描述

8 回答

?
開滿天機

TA貢獻1786條經驗 獲得超13個贊

對于java這樣有塊級作用域的語言,for循環中的obj對象在外面是無法使用的,能夠很好地規避全局作用變量(不確定這個詞是否表述正確)。

查看完整回答
反對 回復 2019-03-01
?
PIPIONE

TA貢獻1829條經驗 獲得超9個贊

盡量使變量的可訪問性最小化,這樣可以避免誤調用

查看完整回答
反對 回復 2019-03-01
?
小唯快跑啊

TA貢獻1863條經驗 獲得超2個贊

這個編譯器一般會優化的,有一種優化叫循環局部變量外提的優化。可以去看看。比如你的這種情況,編譯器會把第一種情況優化為第二種,實際中很多人會傾向于使用第二種吧,但使用第一種也無可厚非。

這邊有個討論帖子可以看看。鏈接描述

查看完整回答
反對 回復 2019-03-01
?
阿晨1998

TA貢獻2037條經驗 獲得超6個贊

第一種能夠保證對象的整個生命周期在for循環內,規避了很多問題,比如for循環結束了,object就是可回收的了。也不會出現亂引用造成泄露的問題。
至于創建對象的個數,兩種都一樣多,都是在堆里面創建,只有當基本類型時,因為是在棧里面操作,存在常量池的概念,可以通過引用來使用對象

查看完整回答
反對 回復 2019-03-01
?
慕容森

TA貢獻1853條經驗 獲得超18個贊

第一種更清晰,不容易出問題,實際效果上差別不大,可以忽略。
如果有下面這種情況,第二種寫法就會有問題
Object obj = null;
Collection c ;
for (condition){

obj = new Object();
//handle obj
if(condition2){
    c.add(obj);
}

}

查看完整回答
反對 回復 2019-03-01
?
猛跑小豬

TA貢獻1858條經驗 獲得超8個贊

個人覺得第一種方式靠譜,第二種方式存在一定的問題:
因為竟然你需要在循環中創建一個對象,肯定是需要這個對象接收值,如果用第二種方式,那么在循環中,如果你將你new的對象放入一個list中,你就會發現,無論你循環多少次,這個list中長度永遠只有一個,因為在循環中,你為這個對象賦值,只是值改變了,但是引用是不變的,那放入list中,那永遠長度只會是1.

查看完整回答
反對 回復 2019-03-01
?
Helenr

TA貢獻1780條經驗 獲得超4個贊

編譯器會優化的,但是只從寫法內容上來看,第二種寫法對內存的占用會小一些.
這個要看你預估循環的次數,如果次數很少的話,沒有什么區別.
如果循環次數比較多,第一種寫法的obj變量就會在棧內存,同時指向在堆內存中new出的對象.
而第二種寫法,obj變量只在棧內存中有一份,然后一直改變指向的堆內存對象.

查看完整回答
反對 回復 2019-03-01
  • 8 回答
  • 0 關注
  • 829 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號