这是一本关于 Java 的书的准确陈述。有人可以确认这是否确实正确吗?
为什么在包装类上完成的操作成本会高于它们的原始对应物?
这当然是对的。当您使用包装类时,会出现很多事情:
1)原始到对象的隐式转换,这并不容易填充包装类的许多私有变量来为原始创建对象。我相信这是一个开销。
2)如果它不是原始的,他们还必须注意空值检查,你知道要避免著名的 NPE(NullPointerException) ,这是额外的开销。
有很多这样的原因,但我相信你已经得到了答案。:)
有人可以确认这是否确实正确吗?
是的,可以构建一个非常粗略的基准来证明对原语的操作至少要快一个数量级:
// 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.");
Primitives: 1125085 x1000 additions completed.
Wrapper: 112760 x1000 additions completed.
如您所见,基元速度至少快十倍,即使在这个非常粗略的测试中,测量时间需要很大一部分时间。
为什么在包装类上完成的操作成本会高于它们的原始对应物?
这很容易解释:除了对原语执行的操作本身之外,对包装器的操作还需要这些操作:
与对原语内的值执行的算术运算相比,分配操作特别昂贵。