1

假设我们有一个装箱的 double 变量,foo我们想将它的值乘以并将其2存储在另一个装箱的 double 变量中bar。从以下方法,

方法一:

Double bar = foo * 2;

和,

方法二:

Double bar = Double.valueOf(foo.doubleValue() * 2);

考虑到效率、可读性等,哪一个更可取?或者差异是如此微不足道,以至于这些方法实际上是等效的?

4

3 回答 3

6

方法一更好。

  • 它可以被人类阅读
  • 在其他条件相同的情况下,更少的字符比更多的字符更好
  • 编译器可能会消除任何性能差异。
于 2013-01-11T16:33:54.940 回答
4

我认为无论您如何尝试优化它,java都会使这个版本Double bar = foo * 2;至少与您的解决方案一样优化。试图获得这样的表现通常是徒劳的。

于 2013-01-11T16:33:15.517 回答
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

您看得出来差别吗?

于 2013-01-11T16:33:46.270 回答