最有效的方法是将盒装双倍乘以2?

时间:2013-01-11 16:29:59

标签: java double wrapper

假设我们有一个盒装双变量foo,我们希望将其值乘以2并将其存储在另一个盒装双变量bar中。从以下方法,

方法一:

Double bar = foo * 2;

方法二:

Double bar = Double.valueOf(foo.doubleValue() * 2);
考虑到效率,可读性等,哪一个更优选?或者差异是如此微不足道,以至于这些方法实际上是等同的?

3 个答案:

答案 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

你能发现差异吗?