考虑以下基础:
- 任何
Object
只生活在堆上, - 阵列 IS-A
Object
和 Integer
IS-AObject
我发现自己很难回答这样一个简单的问题:JVMint[]
之间和内部有什么区别吗?还是仅在“编译时”才有意义?Integer[]
运行时有区别。
int[]
是原始 int 值的数组。Integer[]
是一个“对象”数组,包含对 Integer 对象的引用。
最重要的实际区别:int[]
不能保存null
值。
但我仍然很困惑:是否
int[]
只存储原始值?如果是这样 - 这是否意味着原始类型可以存在于堆上而不被包装?
int[]
确实存储原始类型。并且数组本身存在于堆上。但是,这些原语被分配为数组的一部分。它们不会单独存储在堆的其他地方。这与原始字段如何成为对象实例的一部分非常相似:对象位于堆上,并且其字段是该对象的组成部分(而对于非原始字段,只有引用存储在对象内部并且引用指向的目标实例单独存储在堆上)。
你可以说它int
被“包裹”在数组中。
首先,Integer是类/对象,而int是原始类型。Integer 是int的包装器。如果您需要存储空值,或者需要使用collection,请使用 Integer。你可以做-
List<Integer> integerList = new ArrayList<Integer>();
因此,原始类型数组不同于整数对象数组。
比这里总结的 Integer 和 int 之间存在差异。