int[] 和 Integer[] 数组 - 有啥区别?

Posted

技术标签:

【中文标题】int[] 和 Integer[] 数组 - 有啥区别?【英文标题】:int[] and Integer[] arrays - What is the difference?int[] 和 Integer[] 数组 - 有什么区别? 【发布时间】:2013-09-21 14:56:22 【问题描述】:

考虑以下基础:

    任何Object 都只存在于堆中, 阵列 IS-A ObjectInteger IS-A Object

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

【问题讨论】:

【参考方案1】:

在运行时存在差异。

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

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

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

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

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

【讨论】:

您也可以将 null 分配给数组,而不管它存储的类型如何 是的,数组本身可以为空。但不是原始类型数组中的元素。 @Thilo,非常感谢您的回答。但我仍然感到困惑:int[] 是否只存储原始值?如果是这样 - 这是否意味着原始类型可以存在于堆上而不被包装?【参考方案2】:

这张图片应该可以帮助您理解其中的区别:

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

当你有一个Integers 数组时,你实际上有一个对象 数组。 ints 的数组是原始类型的数组。

由于数组是对象,它们被分配在堆上。如果是ints 的数组,这些ints 也将分配在堆上,在数组内。

您可能会发现this link 很有帮助。

【讨论】:

【参考方案3】:

首先,Integer 是一个类/对象,而int 是一个原始类型。整数是一个 wrapper 用于 int。如果您需要存储一个 null 值,或者需要使用 collection,请使用 Integer。你可以做-

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

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

【讨论】:

【参考方案4】: Integer[] 是对象的数组(对象) int[] 是一个数组(对象) 基元数

Integer 和 int summarized here 是有区别的。

【讨论】:

以上是关于int[] 和 Integer[] 数组 - 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

int 和 integer 有啥区别

int和integer有啥区别

Int 和 Integer 有啥区别?

integer和int有啥区别

PHP中int和integer有啥区别?

Scala中的Int和Integer有啥区别?