为了账号安全,请及时绑定邮箱和手机立即绑定

急求!!!!effective java item6 避免创建不必要的对象求指导!

急求!!!!effective java item6 避免创建不必要的对象求指导!

月关宝盒 2019-07-26 23:50:00
在《effectivejava》中‘避免创建不必要的对象’一节,有如下代码privatestaticlongsum(){Longsum=0L;for(longi=0;i
查看完整描述

2 回答

?
慕的地8271018

TA贡献1796条经验 获得超4个赞

0,不知道这本书的序言你看了没有,若你看了就应该知道它不适合初学者,否则你也不会有这样的问题了1,对于你所提的问题,像这样直接给包装类型赋值,jvm在执行时相当于调用该包装类的valueof方法,对于Long的valueof方法java.lang.Long#valueOf(long),如果i不在longcache中,那么就newLong(i)一个新对象,显然上述代码中,在sum几次遍历后大于127就会创建新的实例,至于为什么有longcache,你可以理解为帮机器节省内存(毕竟这些类上世纪就已经设计出来了,那时的机器内存可没有现在这么多)
                            
查看完整回答
反对 回复 2019-07-26
?
弑天下

TA贡献1818条经验 获得超8个赞

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-07-26
  • 2 回答
  • 0 关注
  • 278 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信