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

在《effectivejava》中‘避免创建不必要的对象’一节,有如下代码
privatestaticlongsum(){
Longsum=0L;
for(longi=0;i<=Integer.MAX_VALUE;i++)
sum+=i;
returnsum;}
Thisprogramgetstherightanswer,butitismuchslowerthanitshouldbe,duetoaone-charactertypographicalerror.ThevariablesumisdeclaredasaLonginsteadofalong,whichmeansthattheprogramconstructsabout231unnecessaryLonginstances(roughlyoneforeachtimethelongiisaddedtotheLongsum).为什么把sum设置成Long对象,会在每一次循环的时候创建Long实例?
月关宝盒
浏览 279回答 2
2回答

慕的地8271018

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

弑天下

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
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript