如果说同样大小的数组,Integer[] 要比 int[] 多占用 6 倍 内存。为什么在 Java 中想要一个包含整型值的 列表 List<int>,实际上得到的却是一个包含整型对象的列表 List<Integer>。
参考来源 1, 扩展阅读 12
扩展阅读
在Java中,int[]
和 Integer[]
在内存占用上的确存在显著差异。具体来说,对于相同大小的数组,Integer[]
通常会比 int[]
占用更多的内存。这是因为:
int[]
:每个元素直接存储整数值,占用4个字节(32位系统上)。Integer[]
:每个元素都是一个Integer
对象的引用,而每个Integer
对象除了存储实际的整数值外,还包含了对象头和其他元数据。因此,每个Integer
对象在堆上占用的内存远大于4个字节,具体取决于JVM的实现,但通常会比int
大很多。
然而,当你尝试创建一个包含整型值的列表 List<int>
时,实际上得到的是 List<Integer>
,这是由于Java的泛型机制和自动装箱/拆箱特性:
- 泛型限制 :Java的泛型不支持基本数据类型,只能使用对象类型。因此,
List<int>
是非法的,编译器会报错。你需要使用List<Integer>
来代替。 - 自动装箱/拆箱 :Java提供了自动装箱(将基本类型转换为对应的包装类型)和拆箱(将包装类型转换回基本类型)的功能。这意味着你可以像操作基本类型一样操作
List<Integer>
,例如:1java
List<Integer> list = new ArrayList<>(); list.add(1); // 自动装箱,将 int 1 转换为 Integer 对象 int value = list.get(0); // 自动拆箱,将 Integer 对象转换回 int
综上所述,虽然 Integer[]
比 int[]
占用更多内存,但在使用集合(如 List
)时,必须使用 List<Integer>
而不是 List<int>
,因为Java的泛型不支持基本数据类型。