【问题标题】:Java Primitive Types: int vs. IntegerJava 原始类型:int 与 Integer
【发布时间】:2011-09-22 09:45:45
【问题描述】:

我对在 Java 中何时使用原始类型与非原始(?)类型(即 int 与 Integer)感到困惑。我意识到在某些地方你不能使用原始类型(例如在使用generics 时)。但是在“正常”代码中呢?使用非原始类型是否会降低性能?使用 Android 时会怎样?

***我的问题与question 非常相似,这是由下面的一位发帖人发现的。链接问题的答案提供了对此问题的更多见解,下文未涵盖。

***“非原始”类型被正式称为引用类型。

【问题讨论】:

  • 除了下面提到的之外的另一个区别是null不能分配给原始类型
  • 另一个区别是 Object 可以转换为引用类型,即 Float,但不能转换为原始类型 (float)

标签: java android types


【解决方案1】:

简答:int 是一个数字; Integer 是可以引用包含数字的对象的指针。使用Integer 进行算术涉及更多的CPU 周期并消耗更多的内存。 int 不是对象,不能传递给任何需要对象的方法(就像您所说的泛型一样)。

【讨论】:

  • 如果我没记错的话,一个 int 被分配在堆栈上,而 Integer 在堆上......
  • 我相信引用在堆栈上,但实际的整数值本身在堆上。
【解决方案2】:

非原始类型是对象。它们必须被动态分配、垃圾收集和检查是否为空(尽管其中一些操作可能会被优化编译器删除)。读取它们的实际值需要从指针加载。原始类型是值。它们通常占用的空间更少,访问速度更快。

一个好的经验法则是,使用原始类型除非您需要多态性,在这种情况下使用相应的对象。

【讨论】:

    【解决方案3】:

    在类型之间进行转换会有轻微的损失 (autoboxing)。另外int 的开销会少一些,所以如果可以的话,我会一直选择int。

    另请参阅此问题:When to use primitive and when reference types in Java

    【讨论】:

      【解决方案4】:

      在 Java 中,int 是原始数据类型,而 Integer 是 Wrapper 类。

      int,作为原始数据类型,灵活性较低。我们只能在其中存储整数的二进制值。 由于Integer 是int 数据类型的包装类,它为我们在存储、转换和操作整数数据方面提供了更大的灵活性。 Integer 是一个类,因此它可以调用class 中定义的各种内置方法。 Integer 类型的变量存储对 Integer 对象的引用,就像任何其他引用(对象)类型一样。

      你可以找到更详细的解释here。

      【讨论】:

        【解决方案5】:

        作为一个 OO 纯粹主义者,您可能会完全避开原语,并且该死的性能成本和缺少后缀运算符。 (是的,有性能成本。)作为设计师,您也可以仅出于可扩展性考虑而采用这种方法(不必拘泥于纯度。)

        作为一个实际问题(理论和美学问题之外),尽可能使用原语,并在不能使用原语的地方使用对象版本。 (您已经提到了一个这样的案例。语言和 API 将推动这一决定。)

        作为一个性能狂,你可能会避开对象版本,如果你踩到一些 OO 黄金法则和神圣不可侵犯的禁忌,你可能不会太在意:性能为王,你会做出相应的决定。

        在您形成自己的教条偏好之前,我建议您从选项 2 开始! :)

        【讨论】:

        • 似乎创建 JVM 的人允许运算符重载,只是我们不能使用。对于整数,我们可以使用运算符。
        【解决方案6】:

        我的观点:使用整数作为参数或返回值允许原始整数不允许的一件事:使用null。但这是个好主意吗?我认为它很少发生。

        就性能而言:编译器会在一定程度上优化你的代码,所以大多数时候这不是一个真正的问题。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-12-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-01-27
          • 2014-12-01
          • 1970-01-01
          相关资源
          最近更新 更多