考虑以下基础知识:
Object
仅存在于堆上,Object
和Integer
IS-A Object
我发现自己很难回答这么简单的问题:JVM中的int[]
和Integer[]
之间是否存在差异?或者仅在“编译时”才有意义?
答案 0 :(得分:20)
运行时存在差异。
int[]
是一个原始int值的数组。 Integer[]
是一个“对象”数组,保存对Integer对象的引用。
最重要的实际差异:int[]
无法保留null
值。
但我仍然感到困惑:
int[]
只存储原始值吗?如果是这样 - 这不是说原始类型可以在没有被包装的情况下存在于堆上吗?
int[]
存储基本类型。阵列本身就存在于堆中。但是,这些原语被分配为数组的一部分。它们不会单独存储在堆上的其他位置。这与原始字段是对象实例的一部分非常相似:对象在堆上,其字段是该对象的组成部分(而对于非原始字段,只有引用存储在对象内部)并且引用点的目标实例分别存储在堆上。
你可以说int
被“包裹”在数组中。
答案 1 :(得分:6)
此图片可以帮助您了解差异:
当你有一个Integer
数组时,你实际上有一个对象数组。 int
s数组是一个基本类型数组。
由于数组是对象,因此它们在堆上分配。如果它是int
的数组,那么这些int
也将在数组中分配在堆上。
您可能会发现this link有帮助。
答案 2 :(得分:1)
首先,Integer是一个类/对象,而int是一个基本类型。对于int,整数是wrapper。如果需要存储 null 值,或者需要使用collection,请使用Integer。你可以做 -
List<Integer> integerList = new ArrayList<Integer>();
因此,基本类型数组与整数对象数组不同。
答案 3 :(得分:1)
与Integer和int summarized here之间存在差异。