在Java中应该避免自动装箱吗?

sim*_*ula 12 java autoboxing

在某些情况下,方法需要基本类型double,并将Double对象作为参数传递.

由于编译器将传递的对象解包,这会增加内存使用量还是降低性能?

小智 8

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

喜欢原始类型

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

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


Boz*_*zho 6

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

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


Joa*_*uer 5

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

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

好处:

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

    省去所有不必要的.doubleValue()Double.valueOf()减少视觉噪音,并使您的代码更容易阅读.

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

缺点:

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

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

  • 自动拆箱可以引入NullPointerException您不期望的地方:

    public void frobnicate(Double d) {
      double result = d / 2;
      // ...
    }
    
    Run Code Online (Sandbox Code Playgroud)
  • 使用自动装箱值的集合使用了很多可比的更多的内存double[],例如.