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

时间:2011-09-30 12:54:29

标签: java autoboxing

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

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

5 个答案:

答案 0 :(得分:8)

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

  

首选原始类型

     

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

     
      
  1. 原始类型可能比相应的包装器快很多   类型,永远不会慢。
  2.   
  3. 包装器的不变性(创建后无法更改)   类型可能使他们无法使用。
  4.   
  5. 可能会有一些涉及==的意外行为(比较   引用)和.equals()(比较值)。请参阅下面的参考   例如。
  6.   

答案 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/