读书人

请问一个装箱拆箱的有关问题

发布时间: 2013-03-10 09:38:39 作者: rapoo

请教一个装箱拆箱的问题
下面两段代码


[解决办法]
请问一个装箱拆箱的有关问题第二段应该不会快啊,你这个循环有可能直接被编译器优化掉了
volatile int i  ;
public void haha(){
String a = "abc";
Integer b = 1;
String c = null;
long begin = System.nanoTime();
for( i = 0 ; i < 1000; i ++){
c = a + b;
}
System.out.println(System.nanoTime() - begin);
System.out.println(c);
}

[解决办法]
你的第二段代码, b是个基本数据类型。当在与字符串进行拼接的时候是直接来的,不需要在转化,也就是你说的拆箱。

而你的第一段代码,b是个引用数据类型,每次执行拼接的时候都要,进行拆箱,你说那个慢?

就好像每一次循环第一次比第二次 多做了点事,所以就慢的罗
[解决办法]
个人感觉:1.Integer b = 1;是有个装箱的步骤。2.基本数据类型在于String相加的时候应该是会调用String.valueOf(i);而Integer会执行toString方法,方法的入栈出栈也存在的一定的差异。当然这些只是猜测。


当循环增加到100000000次后与10000次的平均循环时间比其实有降低。
[解决办法]
这个运行时间应该每次都不同才对。不存在严格的第一段比第二段快慢之分。
[解决办法]

引用:
谢谢楼上各位的回答~刚才试了下,
把两个.class文件分别用javap查看
关键的区别应该在第一段的+操作是(Integer)
33:invokevirtual#40; //Method java/lang/StringBuilder.append:(Ljava/lang/Object;)Ljava/lang/StringBuilder;
第二段的是(……

应该就是这个原因,int转为String代价更小一些

读书人网 >J2SE开发

热点推荐