Java泛型集合只能存放引用类型,基本类型需用对应包装类(如Integer、Double)并通过自动装箱/拆箱实现;注意null导致的NullPointerException及性能问题,运行时泛型擦除是根本原因。

Java 中泛型集合(如 ArrayList、HashMap)只能存放引用类型,不能直接存 int、double 等基本数据类型。解决办法是用对应的包装类(如 Integer、Double)自动装箱/拆箱,让基本类型“变成”对象参与泛型操作。
用包装类替代基本类型声明集合
声明集合时,必须使用包装类而非基本类型。编译器会拒绝 ArrayList 这样的写法,但允许 ArrayList。
-
ArrayList存整数,ArrayList存布尔值 -
Map表示键为字符串、值为浮点数的映射 - 所有 8 种基本类型都有对应包装类:
Byte、Short、Integer、Long、Float、Double、Character、Boolean
自动装箱和拆箱简化使用
Java 5 起支持自动装箱(primitive → wrapper)和拆箱(wrapper → primitive),代码更简洁:
- 添加元素时,
list.add(100)实际调用list.add(Integer.valueOf(100)) - 取值时,
int x = list.get(0)自动调用list.get(0).intValue() - 注意:拆箱遇到
null会抛NullPointerException,比如从Map中 get 一个不存在的 key 返回null,再直接赋给int就会崩
避免空指针和性能陷阱
包装类是对象,有 null 值风险,且频繁装拆箱可能影响性能:
- 判空再拆箱:
Integer val = map.get("key"); if (val != null) int i = val; - 循环中大量计算慎用
Integer,比如计数器建议用基本类型局部变量 - 集合初始化时优先用
Integer.valueOf(n)而非new Integer(n),前者复用缓存(-128 到 127)
泛型限制的本质与替代方案
泛型在运行时被擦除,JVM 只认 Object,而基本类型不是 Object 的子类,所以无法参与泛型。这是语言设计决定的,不是 bug。
- 若需高性能数值集合,可考虑第三方库如
fastutil、trove提供的IntArrayList等原生类型集合 - Lombok 的
@Value或记录类(record)配合包装类可减少样板代码 - JDK 14+ 的模式匹配(
instanceof检查后自动类型转换)对包装类解包也有帮助
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











