12

在某些情况下,方法需要原始类型double,而您将Double对象作为参数传递。

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

4

5 回答 5

9

这是 Java Notes 在自动装箱时所说的:

首选原始类型

出于两个原因,在不需要对象的情况下使用原始类型。

  1. 原始类型可能比相应的包装类型快很多,而且永远不会慢。
  2. 包装器类型的不变性(创建后无法更改)可能使其无法使用。
  3. 可能会出现一些涉及 ==(比较引用)和 .equals()(比较值)的意外行为。有关示例,请参见下面的参考。
于 2011-09-30T12:56:08.403 回答
6

经验法则是:尽可能使用原语。

在某些情况下这是不可能的,比如集合,所以只有在那时才使用包装器。

于 2011-09-30T12:57:13.317 回答
5

这是一种设计选择,并不是对每种情况都做出了简单的回答。

有几个项目可能会影响您的决定:

优点:

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

    省略所有不必要的内容.doubleValue()Double.valueOf()减少视觉噪音,并使您的代码更易于阅读。

  • 自动装箱允许您轻松使用原始值的集合(例如 a List<Double>,...)

缺点:

  • 过多的、不必要的自动装箱和自动拆箱影响您的表现。

    例如,如果您有一个返回a的 APIdouble和另一个期望a 的API double,但是您将值作为Double处理在两者之间,那么您正在执行无用的自动装箱。

  • 自动拆箱可能会NullPointerException在您意想不到的地方引入:

    public void frobnicate(Double d) {
      double result = d / 2;
      // ...
    }
    
  • 例如,使用自动装箱值的集合比可比较的值使用更多的内存double[]

于 2011-09-30T12:58:37.310 回答
3

如果谈论性能,您不必避免自动装箱,JVM 应该处理它。您唯一应该考虑的是代码的可读性。

于 2011-09-30T12:58:34.080 回答
1

应该避免自动装箱。它可能由于过载而导致错误,并且会对性能产生一些影响。尽管如此,这在您的应用程序中可能不是问题。但要注意影响。

这是我的帖子: https ://effective-java.com/2010/05/the-advantages-and-traps-of-autoboxing/

于 2014-09-26T11:37:17.667 回答