跳转到内容

Java数组工具类

来自代码酷

模板:Note

Java数组工具类[编辑 | 编辑源代码]

Java数组工具类(Java Array Utilities)是指Java标准库中提供的用于操作数组的工具类集合,主要包括java.util.Arraysjava.lang.reflect.Array。这些类提供了静态方法来实现数组的排序、搜索、填充、复制等常见操作,极大简化了数组处理工作。

核心工具类[编辑 | 编辑源代码]

java.util.Arrays[编辑 | 编辑源代码]

Java中最常用的数组工具类,提供以下功能分组:

功能类别 方法示例 说明
sort(), parallelSort() | 支持基本类型和对象数组
binarySearch() | 二分查找(数组需先排序)
equals(), deepEquals() | 深度比较多维数组
fill() | 批量初始化数组元素
asList(), stream() | 数组与集合/流的转换
copyOf(), copyOfRange() | 安全复制数组

java.lang.reflect.Array[编辑 | 编辑源代码]

用于动态创建和访问数组的底层工具类,主要功能包括:

  • 动态创建数组:newInstance()
  • 获取数组长度:getLength()
  • 反射方式访问元素:get()/set()

主要方法详解[编辑 | 编辑源代码]

数组排序[编辑 | 编辑源代码]

// 基本类型数组排序
int[] numbers = {5, 3, 9, 1};
Arrays.sort(numbers);  // 结果为 [1, 3, 5, 9]

// 对象数组排序(需实现Comparable)
String[] words = {"banana", "apple", "pear"};
Arrays.sort(words);  // 按字典序排序

// 并行排序(大数据量性能更优)
int[] largeArray = new int[1000000];
Arrays.parallelSort(largeArray);

二分查找[编辑 | 编辑源代码]

页面模块:Message box/ambox.css没有内容。

int[] sorted = {10, 20, 30, 40};
int index = Arrays.binarySearch(sorted, 30);  // 返回2
int notFound = Arrays.binarySearch(sorted, 25);  // 返回-3(插入点)

数组比较[编辑 | 编辑源代码]

int[] a = {1, 2, 3};
int[] b = {1, 2, 3};
int[] c = {1, 3, 2};

System.out.println(Arrays.equals(a, b));  // true
System.out.println(Arrays.equals(a, c));  // false

// 多维数组比较
int[][] matrix1 = {{1,2}, {3,4}};
int[][] matrix2 = {{1,2}, {3,4}};
System.out.println(Arrays.deepEquals(matrix1, matrix2));  // true

数组填充[编辑 | 编辑源代码]

char[] chars = new char[5];
Arrays.fill(chars, 'A');  // ['A', 'A', 'A', 'A', 'A']

// 部分填充
Arrays.fill(chars, 1, 3, 'B');  // ['A', 'B', 'B', 'A', 'A']

高级特性[编辑 | 编辑源代码]

数组转流[编辑 | 编辑源代码]

Java 8+ 支持将数组转为Stream:

String[] languages = {"Java", "Python", "C++"};
long count = Arrays.stream(languages)
                  .filter(s -> s.startsWith("J"))
                  .count();  // 结果为1

并行操作[编辑 | 编辑源代码]

graph LR A[原始数组] --> B[分割] B --> C[子数组1] B --> D[子数组2] B --> E[子数组n] C --> F[并行处理] D --> F E --> F F --> G[合并结果]

示例:

int[] data = new int[10000];
Arrays.parallelSetAll(data, i -> i * 2);  // 并行初始化
Arrays.parallelPrefix(data, (a, b) -> a + b);  // 并行前缀和

性能考虑[编辑 | 编辑源代码]

  • sort() vs parallelSort()临界点:约213个元素
  • System.arraycopy()比循环复制快3-5倍
  • 基本类型数组操作比对象数组快约40%

实际应用案例[编辑 | 编辑源代码]

场景:电商系统需要统计每月销售额Top 10商品

class Product {
    String name;
    double sales;
    // 构造方法/getters省略
}

Product[] monthlyProducts = getMonthlyProducts(); // 获取所有商品数据

// 按销售额降序排序
Arrays.sort(monthlyProducts, 
    (p1, p2) -> Double.compare(p2.getSales(), p1.getSales()));

// 获取前10
Product[] top10 = Arrays.copyOf(monthlyProducts, 10);

// 转换为报表格式
String report = Arrays.stream(top10)
                     .map(p -> p.getName() + ": " + p.getSales())
                     .collect(Collectors.joining("\n"));

常见问题[编辑 | 编辑源代码]

模板:Q&A 模板:Q&A

最佳实践[编辑 | 编辑源代码]

  1. 处理大型数组时优先考虑parallelSort()
  2. 使用Arrays.copyOf()而非手动复制
  3. 对象数组排序时明确指定Comparator避免ClassCastException
  4. 使用Arrays.stream()进行现代函数式操作