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

Java 中泛型集合(如 ArrayList、HashMap)只能存引用类型,基本类型(int、boolean 等)不能直接放入。包装类就是为此设计的“桥梁”——把基本值转成对象,让它们能合法进泛型容器。
用对应包装类声明泛型类型
每种基本类型都有唯一匹配的包装类,声明集合时必须用它:
-
int→Integer:ArrayList<integer> list = new ArrayList();</integer> -
double→Double:Set<double> scores = new HashSet();</double> -
char→Character:Stack<character> stack = new Stack();</character> -
boolean→Boolean:Map<string boolean> flags = new HashMap();</string>
写 ArrayList<int></int> 会编译报错,JVM 在类型擦除后需要原始类型是 Object 子类,而 int 不是。
靠自动装箱简化存值过程
你不需要每次手动调 Integer.valueOf(),Java 编译器会自动完成装箱:
-
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()。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











