盒装基元优于基元的优缺点

时间:2013-05-31 15:52:47

标签: java primitive boxing

我的问题是在Java应用程序中使用盒装基元而不是使用基元之间有什么优缺点?

以下是一些可能或可能不正确的优点和缺点:

一个优点是允许null,因此类型与可能允许空值的数据库类型更接近。

盒装基元的另一个优点是创建防御性副本不需要初始化另一个基本类型,只需要指向一个基元,这可以节省时间。

盒装基元的一个缺点是它们在性能方面比原始语言更昂贵,但是流行的观点似乎是在开发的后期以及如果性能成为问题时值得担心的费用。

另一个缺点是,将盒装基元与'=='进行比较似乎会导致指针被比较而不是基础类型。

您对这些优点或缺点有反馈吗?您对其他人有所了解吗?

提前致谢。

2 个答案:

答案 0 :(得分:2)

盒装基元相对于常规基元的最大优势是能够在标准Java集合中使用它们。例如,可以制作ArrayList<Integer>,但不能ArrayList<int>

它们最大的缺点是内存和性能方面的成本:取决于架构和底层类型,内存成本可能高达9倍(考虑装箱{{1在64位平台上)。性能成本是双重的:每次需要值时都需要额外的解包周期,但更重要的是,内存占用会影响实际内存的访问顺序,这可能会降低CPU数据缓存的效率。 / p>

您列出的其他优点/缺点也适用:

  • 盒装基元可以为空,
  • 您不需要复制值,只需复制引用(仅当引用的大小小于数据大小时才会节省时间和空间,例如,当您有byte时32位平台)。
  • 盒装基元更难以比较平等/不平等。

“防御性复制”点不适用,因为Java中的所有盒装基元都是不可变的。

答案 1 :(得分:0)

集合框架和泛型专门使用对象。所以拳击变得必不可少在泛型中,Java做了一种叫做类型擦除的东西。

  

当编译器找到泛型类型或方法的定义时,它会删除所有&gt;类型参数的出现并用最左边的边界替换它们,或者如果没有指定绑定则键入&gt; Object。

这意味着你在泛型中永远不会有原始类型。