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