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

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

跪求!effective java item6 避免創建不必要的對象十分感謝

跪求!effective java item6 避免創建不必要的對象十分感謝

慕勒3428872 2019-09-09 21:43:51
在《effectivejava》中‘避免創建不必要的對象’一節,有如下代碼privatestaticlongsum(){Longsum=0L;for(longi=0;i
查看完整描述

2 回答

?
喵喵時光機

TA貢獻1846條經驗 獲得超7個贊

0,不知道這本書的序言你看了沒有,若你看了就應該知道它不適合初學者,否則你也不會有這樣的問題了1,對于你所提的問題,像這樣直接給包裝類型賦值,jvm在執行時相當于調用該包裝類的valueof方法,對于Long的valueof方法java.lang.Long#valueOf(long),如果i不在longcache中,那么就newLong(i)一個新對象,顯然上述代碼中,在sum幾次遍歷后大于127就會創建新的實例,至于為什么有longcache,你可以理解為幫機器節省內存(畢竟這些類上世紀就已經設計出來了,那時的機器內存可沒有現在這么多)
                            
查看完整回答
反對 回復 2019-09-09
?
MM們

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

interesting!自動裝箱和拆箱是jdk1.5的新特性。jdk1.5之前,兩個Integer對象是不能直接相加的。例如
Integera=newInteger(10);
Integerb=newInteger(20);
inta1=a.intValue();
intb1=b.intValue();
intsum=a1+b1;
需要先調用intValue()方法轉化成int,才能實現10+20;
jdk1.5之后,就不需要自己轉化intValue()這一步,jvm幫我們做了‘拆箱’。
再講一下‘裝箱’:例如Longl=100L,賦值操作實際上調用了Long的valueOf方法。
publicstaticLongvalueOf(longl){
finalintoffset=128;
if(l>=-128&&l<=127){//willcache
returnLongCache.cache[(int)l+offset];
}
returnnewLong(l);
}
------------再回到我們的問題上---------------
for(longi=0;i<=Integer.MAX_VALUE;i++)
sum+=i;
每一次循環包括一次相加運算(拆箱)和賦值操作(裝箱)而由valueOf的源碼可知,當數值小于128的時候,valueOf方法返回同一對象;當大于127的時候,valueOf方法是返回了新的Long對象共計(2的31次方-128)次,幾乎等于每一次循環都新創建了一個Long對象,
                            
查看完整回答
反對 回復 2019-09-09
  • 2 回答
  • 0 關注
  • 393 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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