假设我们有一个盒装双变量foo
,我们希望将其值乘以2
并将其存储在另一个盒装双变量bar
中。从以下方法,
方法一:
Double bar = foo * 2;
和
方法二:
Double bar = Double.valueOf(foo.doubleValue() * 2);
考虑到效率,可读性等,哪一个更优选?或者差异是如此微不足道,以至于这些方法实际上是等同的?
答案 0 :(得分:6)
方法一更好。
答案 1 :(得分:4)
我认为无论你如何尝试优化它,java都会使这个版本Double bar = foo * 2;
至少与你的解决方案一样优化。试图获得这样的表现通常是徒劳的。
答案 2 :(得分:4)
第一个。它具有更好的可读性,并将所有装箱/拆箱操作保留在幕后。
不要考虑乘以2 这样简单操作的效率。
...或长答案
有两种方法:
void method1() {
Double foo = 1.0;
Double bar = foo * 2;
}
void method2() {
Double foo = 1.0;
Double bar = Double.valueOf(foo.doubleValue() * 2);
}
使用javac
进行编译,并使用javap
void method1();
Code:
0: dconst_1
1: invokestatic #2 // Method java/lang/Double.valueOf:(D)Ljava/lang/Double;
4: astore_1
5: aload_1
6: invokevirtual #3 // Method java/lang/Double.doubleValue:()D
9: ldc2_w #4 // double 2.0d
12: dmul
13: invokestatic #2 // Method java/lang/Double.valueOf:(D)Ljava/lang/Double;
16: astore_2
17: return
void method2();
Code:
0: dconst_1
1: invokestatic #2 // Method java/lang/Double.valueOf:(D)Ljava/lang/Double;
4: astore_1
5: aload_1
6: invokevirtual #3 // Method java/lang/Double.doubleValue:()D
9: ldc2_w #4 // double 2.0d
12: dmul
13: invokestatic #2 // Method java/lang/Double.valueOf:(D)Ljava/lang/Double;
16: astore_2
17: return
你能发现差异吗?