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

11

考虑以下基本原则:

  1. 任何Object都只存在于堆中,
  2. 数组 IS-A Object
  3. Integer IS-A Object

我发现自己很难回答这样一个简单的问题:在JVM内部,int[]Integer[]之间是否有任何区别?或者它只有在“编译时”才有意义吗?

4个回答

26

运行时有所不同。

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

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

但我还是有点困惑: int[]是否只存储原始值?如果是这样 - 难道原始类型不需要被包装就可以在堆上存在吗?

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

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


无论数组存储的类型是什么,您都可以将null分配给它。 - Anirudha
1
是的,数组本身可以为null。但原始类型数组中的元素不可以。 - Thilo
1
@Thilo,非常感谢您的回答。但我仍然困惑:int[]是否只存储原始值?如果是这样-这不意味着原始类型可以在堆上存在而不被包装吗? - Ilya Gubarev

9

这张图片可以帮助你理解它们之间的区别:

enter image description here

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

当你有一个Integer数组时,实际上你有一个对象数组。而int数组则是一个原始类型的数组。

由于数组是对象,所以它们在堆上分配。如果它是一个int数组,则这些int也将在数组中在堆上分配。

你可能会发现这个链接很有帮助。


1

首先,Integer 是一个类/对象,而 int 是一种原始类型。Integer 是 int 的 包装器。如果你需要存储 null 值,或者需要使用 集合, 请使用 Integer。你可以进行以下操作 -

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

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


1
  • Integer[] 是一个对象数组(object)
  • int[] 是一个基本类型(primitives)的数组(object)

然后,Integer 和 int 之间有一个区别 在此处概述


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