在《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,你可以理解为帮机器节省内存(毕竟这些类上世纪就已经设计出来了,那时的机器内存可没有现在这么多)
弑天下
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){//willcachereturnLongCache.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对象,
添加回答
举报
0/150
提交
取消