java中数组与集合互操作需注意本质差异:数组固定长度、支持基本类型;集合可变大小、仅存对象。遍历和转换易引发unsupportedoperationexception等异常,须严格区分使用场景与类型安全机制。

Java 中数组和集合的互操作性,核心在于理解二者本质差异:数组是固定长度、支持基本类型的底层结构;集合是可变大小、仅容纳对象的高级容器。遍历方式和转换逻辑都由此衍生,稍不注意就会出现 UnsupportedOperationException、ClassCastException 或类型错位问题。
数组遍历的三种常用方式
数组没有 Iterator,也不支持 forEach 方法(除非转成 Stream),主要靠下标或增强 for:
-
普通 for 循环:适合需要索引的场景,如修改元素、比较相邻项。用
arr.length控制边界,安全可靠。 - 增强 for 循环(for-each):简洁易读,适用于只读遍历。注意它无法获取索引,也不能在循环中删除或替换当前元素。
-
Arrays.toString() 辅助查看:不是遍历逻辑,但调试时非常实用。它内部用 StringBuilder 拼接,输出格式为
[a, b, c],比手动拼接更安全。
集合遍历的五种主流方法
List 是最常操作的集合类型,遍历方式多样,各有适用边界:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
-
Iterator 遍历:最底层的方式,支持
it.remove()安全删除当前元素,避免ConcurrentModificationException。 - 增强 for 循环:语法最简,本质调用 Iterator,但禁止修改结构——加/删元素会直接抛异常。
- 普通 for + get(i):对 ArrayList 效率高(O(1) 随机访问),对 LinkedList 则低效(需逐个跳转)。
-
forEach + Lambda:Java 8+ 推荐写法,语义清晰,如
list.forEach(System.out::println)。 -
Stream 遍历:适合带条件、映射或聚合的复杂处理,如
list.stream().filter(x -> x.length() > 3).forEach(...)。
数组转集合的关键细节
看似一行代码的事,实则陷阱密集:
-
对象数组可用 Arrays.asList():如
String[]、Integer[],返回的是固定大小 List,add/remove会抛异常。 -
基本类型数组不能直接用 asList():传
int[]会把整个数组当一个元素,结果是List<int></int>,而非List<integer></integer>。 -
要可变集合,必须包装:如
new ArrayList(Arrays.asList(strArr)),此时与原数组完全解耦。 -
基本类型推荐 Stream 装箱:如
Arrays.stream(intArr).boxed().collect(Collectors.toList())。
集合转数组的正确姿势
重点在类型安全,避免运行时强转失败:
-
别用无参 toArray():它只返回
Object[],强转具体类型数组(如(String[])list.toArray())必抛ClassCastException。 -
务必用有参重载:如
list.toArray(new String[0]),传空数组让 JVM 自动推导类型并分配空间,简洁又健壮。 -
基本类型数组需手动处理:集合存的是包装类,无法直接转
int[],得遍历或用 IntStream:list.stream().mapToInt(Integer::intValue).toArray()。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










