应该在Java中避免自动装箱
我想问一下Java中是否应该避免自动装箱。 由于有些方法需要一个基本类型’double’并且你传递一个’Double’对象作为参数,这应该避免,因为编译器将你传递的对象解包并且可能很重?
这就是Java Notes在autoboxing上所说的:
喜欢原始类型
出于两个原因,使用不需要对象的原始类型。
- 原始类型可能比相应的包装类型快很多,并且从不慢。
- 包装类型的不变性(在创建之后不能更改)可能使它们无法使用。
- 可能存在一些涉及==(比较引用)和.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/