考虑以下基本原则:
- 任何
Object
都只存在于堆中, - 数组 IS-A
Object
且 Integer
IS-AObject
我发现自己很难回答这样一个简单的问题:在JVM内部,int[]
和Integer[]
之间是否有任何区别?或者它只有在“编译时”才有意义吗?
运行时有所不同。
int[]
是一个原始int值的数组。Integer[]
是一个“对象”数组,保存对整数对象的引用。
最重要的实际差异:int[]
不能保存null
值。
但我还是有点困惑:
int[]
是否只存储原始值?如果是这样 - 难道原始类型不需要被包装就可以在堆上存在吗?
int[]
确实存储原始类型。并且数组本身也存在于堆上。然而,这些原始类型是作为数组的一部分分配的。它们不会单独存储在堆的其他位置。这与原始字段是对象实例的一部分非常相似:对象在堆上,其字段是该对象的一个组成部分(对于非原始字段,仅存储引用在对象内部,并且该引用指向的目标实例在堆上单独存储)。
你可以说int
被“包装”在数组中。
然后,Integer 和 int 之间有一个区别 在此处概述。