10

考虑以下基础:

  1. 任何Object只生活在堆上,
  2. 阵列 IS-AObject
  3. IntegerIS-AObject

我发现自己很难回答这样一个简单的问题:JVMint[]之间和内部有什么区别吗?还是仅在“编译时”才有意义?Integer[]

4

4 回答 4

25

运行时有区别。

int[]是原始 int 值的数组。Integer[]是一个“对象”数组,包含对 Integer 对象的引用。

最重要的实际区别:int[]不能保存null值。

但我仍然很困惑:是否int[]只存储原始值?如果是这样 - 这是否意味着原始类型可以存在于堆上而不被包装?

int[]确实存储原始类型。并且数组本身存在于堆上。但是,这些原语被分配为数组的一部分。它们不会单独存储在堆的其他地方。这与原始字段如何成为对象实例的一部分非常相似:对象位于堆上,并且其字段是该对象的组成部分(而对于非原始字段,只有引用存储在对象内部并且引用指向的目标实例单独存储在堆上)。

你可以说它int被“包裹”在数组中。

于 2013-09-17T08:51:59.380 回答
8

此图像应该可以帮助您了解差异:

在此处输入图像描述

int是一个数字,它是一个原始类型
Integer是一个对象

当你有一个Integers 数组时,你实际上有一个objects数组。s数组int是原始类型的数组。

由于数组是对象,因此它们是在堆上分配的。如果它是一个 s 数组int,这些ints 也将分配在堆上,在数组内。

您可能会发现此链接很有帮助。

于 2013-09-17T08:59:31.803 回答
1

首先,Integer是类/对象,而int是原始类型。Integer 是int的包装器。如果您需要存储值,或者需要使用collection,请使用 Integer。你可以做-

List<Integer> integerList = new ArrayList<Integer>();

因此,原始类型数组不同于整数对象数组。

于 2013-09-17T08:55:10.510 回答
1
  • Integer[] 是对象的数组(对象)
  • int[] 是一个基元数组(对象)

比这里总结的 Integer 和 int 之间存在差异。

于 2013-09-17T08:56:17.870 回答