应该在Java中避免自动装箱

我想问一下Java中是否应该避免自动装箱。 由于有些方法需要一个基本类型’double’并且你传递一个’Double’对象作为参数,这应该避免,因为编译器将你传递的对象解包并且可能很重?

这就是Java Notes在autoboxing上所说的:

喜欢原始类型

出于两个原因,使用不需要对象的原始类型。

  1. 原始类型可能比相应的包装类型快很多,并且从不慢。
  2. 包装类型的不变性(在创建之后不能更改)可能使它们无法使用。
  3. 可能存在一些涉及==(比较引用)和.equals()(比较值)的意外行为。 有关示例,请参阅下面的参考。

经验法则是:如果可能,始终使用基元。

有些情况下这是不可能的,比如集合,所以只能使用包装器。

这是一个设计选择,并不是每个案例都可以轻易回答。

有几个项目可能会影响您的决定:

优点:

  • 自动装箱和自动拆箱可以使您的代码更易于阅读:

    .doubleValue()所有不必要的.doubleValue()Double.valueOf()可以减少视觉噪音,并使代码更易于阅读。

  • 自动装箱允许您轻松使用原始值的集合(例如List ,…)

缺点:

  • 过度,不必要的自动装箱和自动拆箱可能会影响您的表现。

    例如,如果你有一个API 返回一个double和另一个期望 double API,但是你把它作为一个Double处理,那么你就是在做无用的自动装箱。

  • auto-unboxing可能会引入一个NullPointerException ,你不期望它:

     public void frobnicate(Double d) { double result = d / 2; // ... } 
  • 使用自动装箱值的集合比使用类似的double[]使用更多的内存。

如果谈论性能,你不必避免自动装箱,JVM应该处理它。 您应该考虑的唯一事项是代码的可读性。

应避免自动装箱。 它可能由于过载而导致错误,并且会对性能产生一些影响。 尽管如此,它可能不是您的应用程序中的问题。 但请注意其影响。

在这里我的post: https : //effective-java.com/2010/05/the-advantages-and-traps-of-autoboxing/