有时候一个方法需要一个原始类型 double
的参数,而你传递了一个 Double
对象。
由于编译器会对传递的对象进行自动拆箱,这是否会增加内存使用或降低性能?
有时候一个方法需要一个原始类型 double
的参数,而你传递了一个 Double
对象。
由于编译器会对传递的对象进行自动拆箱,这是否会增加内存使用或降低性能?
Java Notes上关于自动装箱的说明如下:
优先使用基本数据类型
在没有对象需求时,请使用基本数据类型,有两个原因。
- 基本数据类型可能比相应的包装类型快得多,并且永远不会更慢。
- 包装类型的不可变性(创建后无法更改)可能使它们的使用变得不可能。
- ==(比较引用)和.equals()(比较值)之间可能会出现一些意外行为。请参见下面的参考文献中的示例。
经验法则是:只要可能,尽量使用原始类型。
如果像集合这样的情况不允许使用原始类型,则只能使用包装类。
这是一个设计选择,并不是对每个情况都有简单的答案。
有几个因素可能会影响您的决策:
优点:
自动装箱和自动拆箱可以使您的代码更易于阅读:
省略所有不必要的.doubleValue()
和Double.valueOf()
降低了视觉噪音,有助于让您的代码更易于阅读。
自动装箱使您可以轻松使用原始值集合(例如List<Double>
,...)
缺点:
excessive, unnecessary auto-boxing and auto-unboxing can hinder your performance.
For example, if you have an API that returns a double
and another API that expects a double
, but you handle the value as a Double in between, then you're doing useless auto-boxing.
auto-unboxing can introduce a NullPointerException
where you don't expect it:
public void frobnicate(Double d) {
double result = d / 2;
// ...
}
using collections of auto-boxed values uses a lot more memory than a comparable double[]
for example.
如果涉及到性能,你不必避免自动装箱,JVM应该可以处理。唯一需要考虑的是代码的可读性。
应避免使用自动装箱。它可能会因为重载而导致错误,并且会对性能产生一定的影响。 尽管如此,在您的应用程序中可能不是问题。但请注意其影响。