Java泛型集合只能存储引用类型,基本类型需通过对应包装类(如int→Integer)声明泛型类型;自动装箱/拆箱简化操作但需防空指针和缓存陷阱,比较值应使用equals()。

Java 中泛型集合(如 ArrayList、HashMap)只能存引用类型,基本类型(int、boolean 等)不能直接放入。包装类就是为此设计的“桥梁”——把基本值转成对象,让它们能合法进泛型容器。
用对应包装类声明泛型类型
每种基本类型都有唯一匹配的包装类,声明集合时必须用它:
-
int→Integer:ArrayList<Integer> list = new ArrayList<>(); -
double→Double:Set<Double> scores = new HashSet<>(); -
char→Character:Stack<Character> stack = new Stack<>(); -
boolean→Boolean:Map<String, Boolean> flags = new HashMap<>();
写 ArrayList<int> 会编译报错,JVM 在类型擦除后需要原始类型是 Object 子类,而 int 不是。
靠自动装箱简化存值过程
你不需要每次手动调 Integer.valueOf(),Java 编译器会自动完成装箱:
立即学习“Java免费学习笔记(深入)”;
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
-
list.add(100);等价于list.add(Integer.valueOf(100)); -
flags.put("debug", true);自动转为Boolean.TRUE - 方法传参也一样:
process(new Integer(42))可简写为process(42)(若参数类型是Integer)
但要注意:自动装箱本质仍是创建对象,高频操作(如循环中反复 add(i))可能带来额外 GC 压力。
取值时自动拆箱或显式转换
从集合读出的是包装类对象,使用数值前通常自动拆箱:
-
int value = list.get(0);→ 编译器插入.intValue() -
if (flags.get("active")) { ... }→Boolean自动转boolean
但若对象为 null(比如 map.get("missing") 返回 null),拆箱会抛 NullPointerException。稳妥做法是先判空再调 .xxxValue(),或用 Objects.requireNonNull() 显式防护。
避开 == 比较和缓存陷阱
包装类对象不是“纯值”,尤其 Integer 在 -128 ~ 127 范围内复用缓存实例:
Integer a = 127, b = 127; System.out.println(a == b); // trueInteger c = 128, d = 128; System.out.println(c == d); // false
永远用 .equals() 比较值是否相等;若需数值运算(如求和),先确保非空再调 .intValue() 或 .doubleValue()。

















