在 Spring Boot 2.7 的企业实际开发中,数组操作主要依赖 Java 标准库(java.util.Arrays)和 Spring 框架内置工具类(org.springframework.util 包),两者结合基本能覆盖所有场景。
⚙️ 数组操作核心方法速查
| 操作类型 | 核心方法 | 所属类/库 | 关键说明 |
|---|---|---|---|
| 排序 | Arrays.sort(array) | java.util.Arrays | 对数组进行原地升序排序。 |
| 二分查找 | Arrays.binarySearch(array, key) | java.util.Arrays | 必须在已排序数组中使用。 |
| 数组拷贝 | Arrays.copyOf(original, newLength)Arrays.copyOfRange(original, from, to) | java.util.Arrays | 灵活复制数组全部或部分内容。 |
| 数组填充 | Arrays.fill(array, value) | java.util.Arrays | 将数组所有或指定范围元素设为同一个值。 |
| 数组转字符串 | Arrays.toString(array)Arrays.deepToString(array) | java.util.Arrays | 方便打印一维或多维数组内容。 |
| 数组比较 | Arrays.equals(array1, array2)Arrays.deepEquals(array1, array2) | java.util.Arrays | 比较一维或多维数组内容是否相等。 |
| 集合判空 | CollectionUtils.isEmpty(collection)CollectionUtils.isNotEmpty(collection) | org.springframework.util.CollectionUtils | 安全地检查集合是否为 null 或空。 |
| 数组转集合 | CollectionUtils.arrayToList(array) | org.springframework.util.CollectionUtils | 支持基本类型数组转换。 |
| 数组合并到集合 | CollectionUtils.mergeArrayIntoCollection(array, collection) | org.springframework.util.CollectionUtils | 将数组元素合并到现有集合中。 |
| 集合空值兜底 | CollectionUtils.emptyIfNull(collection) | org.springframework.util.CollectionUtils | 如果集合为 null,返回一个空集合,避免 NPE。 |
| 集合包含检查 | CollectionUtils.contains(collection.iterator(), element) | org.springframework.util.CollectionUtils | 检查集合是否包含某元素。 |
| 对象/数组判空 | ObjectUtils.isEmpty(obj) | org.springframework.util.ObjectUtils | 可检查对象、数组、集合等是否为 null 或空。 |
| 获取首个非空对象 | ObjectUtils.firstNonNull(obj1, obj2, ...) | org.springframework.util.ObjectUtils | 从多个对象中返回第一个非 null 的。 |
| 数组转分隔字符串 | StringUtils.arrayToCommaDelimitedString(arr) | org.springframework.util.StringUtils | 将数组元素用逗号连接成字符串。 |
🚀 数组与集合互转(高频场景)
这是日常开发中最常见的操作之一,需要特别注意不同方法的区别。
数组 转 List
Arrays.asList(T... a):最常用,但返回的List是固定长度的,不能进行add或remove操作。且不支持基本类型数组。// 引用类型数组 -> 正确 String[] strArray = {"a", "b"}; List<String> list = Arrays.asList(strArray); // 基本类型数组 -> 错误! list 实际上是一个包含 int[] 对象的 List int[] intArray = {1, 2}; List<int[]> list = Arrays.asList(intArray);new ArrayList<>(Arrays.asList(array)):创建一个可变的ArrayList,可以自由增删元素。String[] strArray = {"a", "b"}; List<String> list = new ArrayList<>(Arrays.asList(strArray)); list.add("c"); // 可以操作CollectionUtils.arrayToList(array):Spring 提供的工具方法,优雅地解决了基本类型数组的转换问题。int[] intArray = {1, 2}; // 自动将 int[] 转为 List<Integer> List<?> list = CollectionUtils.arrayToList(intArray);Arrays.stream(array).collect(Collectors.toList()):Stream 方式,灵活强大,适用于需要进行过滤、映射等复杂操作后再收集的场景。
List 转 数组
list.toArray(T[] a):标准推荐方式。List<String> list = Arrays.asList("a", "b"); // 传入一个长度相同的空数组,类型安全 String[] array = list.toArray(new String[0]);list.stream().toArray():Java 8 引入的 Stream 方式。List<String> list = Arrays.asList("a", "b"); String[] array = list.stream().toArray(String[]::new);
✨ 高阶技巧:Stream 流式处理
对于复杂的数组操作(过滤、转换、聚合),Stream API 是首选。
int[] numbers = {1, 2, 3, 4, 5};
// 1. 过滤出偶数并打印
Arrays.stream(numbers).filter(n -> n % 2 == 0).forEach(System.out::println); // 输出 2, 4
// 2. 所有元素乘以2并收集为新的List
List<Integer> doubledList = Arrays.stream(numbers)
.map(n -> n * 2)
.boxed() // 将 IntStream 装箱为 Stream<Integer>
.collect(Collectors.toList());对于二维数组,Arrays.stream(arr) 得到的是 Stream<int[]>,即每一行作为一个元素。
🧰 企业常用第三方库
虽然标准库和 Spring 工具类已很强大,但在实际项目中,为了进一步简化代码、减少样板代码,往往会引入一些优秀的第三方库:
- Hutool:国产明星工具库,提供
ArrayUtil等大量实用的数组操作方法。 - Guava:Google 出品,其
Lists、Ints等工具类在集合和数组操作上非常强大。 - Apache Commons Lang:老牌工具库,提供
ArrayUtils类。
这些库通常提供了更丰富、更便捷的API,例如判空、反转、合并等,可以作为补充。
⚠️ 踩坑指南
Arrays.asList()的“坑”:- 返回的是
java.util.Arrays.ArrayList,不是我们常用的java.util.ArrayList,不支持add/remove操作,否则会抛出UnsupportedOperationException。 - 基本类型数组的误用:如
Arrays.asList(new int[]{1,2}),得到的是一个List<int[]>,而非List<Integer>。
- 返回的是
空指针异常 (
NullPointerException):- 当数组或集合为
null时,直接操作或遍历会抛出NPE。建议使用 Spring 的CollectionUtils.isEmpty()或ObjectUtils.isEmpty()进行安全检查。
- 当数组或集合为
数组越界 (
ArrayIndexOutOfBoundsException):- 访问数组时,索引必须在
[0, array.length - 1]范围内。遍历时优先使用增强 for 循环或Arrays.stream()来避免手动管理索引。
- 访问数组时,索引必须在
💎 总结
Spring Boot 2.7 企业开发中的数组操作,核心是掌握 java.util.Arrays 和 org.springframework.util 包下的工具类。对于数组与集合的转换、判空等高频操作,优先使用 Spring 的 CollectionUtils,可以避免很多常见的坑。对于复杂的业务逻辑,善用 Stream API 能让代码更清晰、更优雅。
评论