基本类型必须通过包装类才能存入Java集合,因集合只支持引用类型;自动装箱/拆箱简化操作,但需注意==比较陷阱、null值检查及字符串转换异常处理。

基本类型不能直接放进集合,因为Java集合只认对象。包装类就是专为解决这个问题而生的“桥梁”,让int、double这些原始值能以对象身份参与集合操作。
为什么必须用包装类才能进集合
ArrayList、HashMap这类集合的泛型参数只能是引用类型。写ArrayList
- 集合底层统一处理Object或其子类,基本类型不属于引用类型体系
- 泛型擦除后实际操作的是Object数组,基本类型无法装入
- null值支持也依赖包装类——int不能为null,但Integer可以
实战中怎么把基本类型存进集合
借助自动装箱,过程几乎无感:
- 声明集合时指定包装类泛型: ArrayList
list = new ArrayList(); - 添加基本类型值: list.add(100); → 编译器自动调用Integer.valueOf(100)
- 取出时自动拆箱: int value = list.get(0); → 编译器自动调用intValue()
注意:手动写new Integer(100)已过时,valueOf更高效(尤其-128~127范围复用缓存对象)。
从集合取值时要注意的坑
看似简单,但容易在比较和空值上出错:
- 别用==比较两个Integer: list.get(0) == list.get(1) 可能返回false(超出缓存范围时地址不同),改用equals()
- 取值前先判空:集合里可能存了null,直接拆箱会触发NullPointerException,应写成Integer val = list.get(i); if (val != null) { int x = val; }
- 数据库查询结果常映射为包装类,比如JDBC的resultSet.getInt("age")返回int,但resultSet.getObject("age")返回Integer,后者可保留null语义
字符串与集合数据的双向转换技巧
实际开发常需把一串数字字符串转成Integer列表,或反过来:
- 字符串转Integer集合:Arrays.stream("1,2,3".split(",")) → map(Integer::parseInt) → collect(Collectors.toList())
- Integer集合转字符串:list.stream().map(String::valueOf) → collect(Collectors.joining(","))
- 遇到非法字符串(如"abc")时,parseInt会抛NumberFormatException,建议用try-catch包裹或提前过滤










