1

这是一本关于 Java 的书的准确陈述。有人可以确认这是否确实正确吗?

为什么在包装类上完成的操作成本会高于它们的原始对应物?

4

3 回答 3

3

这当然是对的。当您使用包装类时,会出现很多事情:

1)原始到对象的隐式转换,这并不容易填充包装类的许多私有变量来为原始创建对象。我相信这是一个开销。

2)如果它不是原始的,他们还必须注意空值检查,你知道要避免著名的 NPE(NullPointerException) ,这是额外的开销。

有很多这样的原因,但我相信你已经得到了答案。:)

于 2013-08-31T05:57:39.910 回答
1
Why operation cost done on wrapper classes will be higher than ??

因为在运行时,如果我们使用 Wrappers装箱转换拆箱转换发生在运行时,显然需要更多时间。

例如。

int考虑一个情况Integer

在运行时

如果 p 是 int 类型的值,则装箱转换将 p 转换为类和 Integer 类型的引用 r,使得 r.intValue() == p

反之亦然,如果我们使用Primitives.

于 2013-08-31T05:57:25.570 回答
1

有人可以确认这是否确实正确吗?

是的,可以构建一个非常粗略的基准来证明对原语的操作至少要快一个数量级:

// Use a primitive type long
long now = System.currentTimeMillis();
long count = 0;
long total1 = 0;
do {
    for (int i = 0 ; i != 1000 ; i++)
        total1 += 11;
    count++;
} while (System.currentTimeMillis()-now < 2000);
System.out.println("Primitives: "+count+"  x1000 additions completed.");
// Use a wrapper type Long
now = System.currentTimeMillis();
count = 0;
Long total2 = 0L;
do {
    for (int i = 0 ; i != 1000 ; i++)
        total2 += 11;
    count++;
} while (System.currentTimeMillis()-now < 2000);
System.out.println("Wrapper: "+count+"  x1000 additions completed.");

会在 ideone 上产生以下结果

Primitives: 1125085 x1000 additions completed.
Wrapper:     112760 x1000 additions completed.

如您所见,基元速度至少快十倍,即使在这个非常粗略的测试中,测量时间需要很大一部分时间。

为什么在包装类上完成的操作成本会高于它们的原始对应物?

这很容易解释:除了对原语执行的操作本身之外,对包装器的操作还需要这些操作:

  • 访问包装类型的内容(即另一个内存读取),
  • 构造一个新的包装对象,以及
  • 隐含地,以前运行中未使用的包装器会增加垃圾收集器所花费的时间。

与对原语内的值执行的算术运算相比,分配操作特别昂贵。

于 2013-08-31T06:15:20.433 回答