在某些情况下,方法需要原始类型double
,而您将Double
对象作为参数传递。
由于编译器将传递的对象拆箱,这会增加内存使用量还是降低性能?
这是 Java Notes 在自动装箱时所说的:
首选原始类型
出于两个原因,在不需要对象的情况下使用原始类型。
- 原始类型可能比相应的包装类型快很多,而且永远不会慢。
- 包装器类型的不变性(创建后无法更改)可能使其无法使用。
- 可能会出现一些涉及 ==(比较引用)和 .equals()(比较值)的意外行为。有关示例,请参见下面的参考。
经验法则是:尽可能使用原语。
在某些情况下这是不可能的,比如集合,所以只有在那时才使用包装器。
这是一种设计选择,并不是对每种情况都做出了简单的回答。
有几个项目可能会影响您的决定:
优点:
自动装箱和自动拆箱可以使您的代码更易于阅读:
省略所有不必要的内容.doubleValue()
并Double.valueOf()
减少视觉噪音,并使您的代码更易于阅读。
自动装箱允许您轻松使用原始值的集合(例如 a List<Double>
,...)
缺点:
过多的、不必要的自动装箱和自动拆箱会影响您的表现。
例如,如果您有一个返回a的 APIdouble
和另一个期望a 的API double
,但是您将值作为Double处理在两者之间,那么您正在执行无用的自动装箱。
自动拆箱可能会NullPointerException
在您意想不到的地方引入:
public void frobnicate(Double d) {
double result = d / 2;
// ...
}
例如,使用自动装箱值的集合比可比较的值使用更多的内存double[]
。
如果谈论性能,您不必避免自动装箱,JVM 应该处理它。您唯一应该考虑的是代码的可读性。
应该避免自动装箱。它可能由于过载而导致错误,并且会对性能产生一些影响。尽管如此,这在您的应用程序中可能不是问题。但要注意影响。
这是我的帖子: https ://effective-java.com/2010/05/the-advantages-and-traps-of-autoboxing/