这是一本关于Java的书的确切陈述。 有人可以确认这是否确实是对的吗?
为什么在包装类上完成的操作成本会高于它们的原始对应物?
答案 0 :(得分:3)
当然这是对的。使用包装类时会出现很多事情:
1)将原语隐式转换为Objects,这并不容易填充包装类的许多私有变量来为基元创建对象。我相信这是一个开销。
2)如果它不是原始的,它们还必须处理空检查,你知道要避免使用着名的NPE(NullPointerException),这是一个额外的开销。
有很多这样的原因,但我相信你得到了答案。 :)
答案 1 :(得分:1)
Why operation cost done on wrapper classes will be higher than ??
因为在运行时,如果我们在运行时使用Wrappers Boxing conversions和Unboxing Conversions,显然需要更多时间。
例如。
考虑使用int
和Integer
运行时间
如果p是int类型的值,那么装箱转换将p转换为类的引用r并输入Integer,这样r.intValue()== p
反之亦然,如果我们使用Primitives
,则会保存此时间。
答案 2 :(得分: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.");
这produces the following results on ideone:
Primitives: 1125085 x1000 additions completed.
Wrapper: 112760 x1000 additions completed.
正如您所看到的,基元的速度至少要快十倍,即使是在非常粗糙的测试中,测量时间也需要相当长的时间。
为什么在包装类上完成的操作成本会高于其原始对应项?
这很容易解释:除了在原语上执行的操作本身之外,包装器上的操作还需要这些操作:
与对基元内部的值执行的算术运算相比,分配操作特别昂贵。