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

12

有时候一个方法需要一个原始类型 double 的参数,而你传递了一个 Double 对象。

由于编译器会对传递的对象进行自动拆箱,这是否会增加内存使用或降低性能?

5个回答

9

Java Notes上关于自动装箱的说明如下:

优先使用基本数据类型

在没有对象需求时,请使用基本数据类型,有两个原因。

  1. 基本数据类型可能比相应的包装类型快得多,并且永远不会更慢。
  2. 包装类型的不可变性(创建后无法更改)可能使它们的使用变得不可能。
  3. ==(比较引用)和.equals()(比较值)之间可能会出现一些意外行为。请参见下面的参考文献中的示例。

1
具体的意外行为包括在取消装箱时出现NullPointerExceptions。 - Ryan Schipper
自动装箱的陷阱:http://www.theserverside.com/news/thread.tss?thread_id=27129 - user195488
是的,但问题是关于“自动装箱”的。如果他问“我应该使用原始类型还是包装类”,那么你当然是正确的,否则自动装箱本身不会影响现代JVM的性能-至少从我所知道的来看。 - Kris
@Kris:他问是否应该避免自动装箱,我回答了“优先使用原始类型”。对于他关于“笨重”的评论,我回答了我的第一个要点。 - user195488
@0A0D:你说的仍然是包装类和基本类型的重量问题,而不是自动装箱本身的重量问题 :) - Kris
由于两个原因 - 列出了3个哈哈 :-) - Ascalonian

7

经验法则是:只要可能,尽量使用原始类型。

如果像集合这样的情况不允许使用原始类型,则只能使用包装类。


5

这是一个设计选择,并不是对每个情况都有简单的答案。

有几个因素可能会影响您的决策:

优点:

  • 自动装箱和自动拆箱可以使您的代码更易于阅读:

    省略所有不必要的.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.


3

如果涉及到性能,你不必避免自动装箱,JVM应该可以处理。唯一需要考虑的是代码的可读性。


0

应避免使用自动装箱。它可能会因为重载而导致错误,并且会对性能产生一定的影响。 尽管如此,在您的应用程序中可能不是问题。但请注意其影响。


链接已经失效。 - Volatile_volvo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接