int[] 和 Integer[] 数组 - 有啥区别?
Posted
技术标签:
【中文标题】int[] 和 Integer[] 数组 - 有啥区别?【英文标题】:int[] and Integer[] arrays - What is the difference?int[] 和 Integer[] 数组 - 有什么区别? 【发布时间】:2013-09-21 14:56:22 【问题描述】:考虑以下基础:
-
任何
Object
都只存在于堆中,
阵列 IS-A Object
和
Integer
IS-A Object
我发现自己很难回答这么简单的问题:int[]
和Integer[]
JVM 内部 之间有什么区别吗?还是仅在“编译时”才有意义?
【问题讨论】:
【参考方案1】:在运行时存在差异。
int[]
是一个原始 int 值数组。 Integer[]
是一个“对象”数组,包含对 Integer 对象的引用。
最重要的实际区别:int[]
不能保存 null
值。
但我仍然感到困惑:
int[]
是否只存储原始值?如果是这样 - 这是否意味着原始类型可以存在于堆上而不被包装?
int[]
确实存储原始类型。并且数组本身存在于堆上。但是,这些原语被分配为数组的一部分。它们不会单独存储在堆的其他地方。这与原始字段如何成为对象实例的一部分非常相似:对象位于堆上,并且其字段是该对象的组成部分(而对于非原始字段,只有引用存储在对象内部并且引用指向的目标实例单独存储在堆上)。
您可以说int
被“包裹”在数组中。
【讨论】:
您也可以将 null 分配给数组,而不管它存储的类型如何 是的,数组本身可以为空。但不是原始类型数组中的元素。 @Thilo,非常感谢您的回答。但我仍然感到困惑:int[] 是否只存储原始值?如果是这样 - 这是否意味着原始类型可以存在于堆上而不被包装?【参考方案2】:这张图片应该可以帮助您理解其中的区别:
int
是一个数字,它是一个原始类型。 Integer
是一个对象。
当你有一个Integer
s 数组时,你实际上有一个对象 数组。 int
s 的数组是原始类型的数组。
由于数组是对象,它们被分配在堆上。如果是int
s 的数组,这些int
s 也将分配在堆上,在数组内。
您可能会发现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[] 数组 - 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章