假设我们有一个装箱的 double 变量,foo
我们想将它的值乘以并将其2
存储在另一个装箱的 double 变量中bar
。从以下方法,
方法一:
Double bar = foo * 2;
和,
方法二:
Double bar = Double.valueOf(foo.doubleValue() * 2);
考虑到效率、可读性等,哪一个更可取?或者差异是如此微不足道,以至于这些方法实际上是等效的?
方法一更好。
我认为无论您如何尝试优化它,java都会使这个版本Double bar = foo * 2;
至少与您的解决方案一样优化。试图获得这样的表现通常是徒劳的。
第一。它具有更好的可读性,并将所有装箱/拆箱操作保持在幕后。
不要考虑乘以 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
您看得出来差别吗?