Java 9 的 Arrays.compare() 系列方法提供标准化字典序比较,支持基本类型和对象数组,逐元素比较并按前缀规则判定大小,含 null 安全的 Comparator 重载版本。

Java 9 引入了 Arrays.compare() 系列方法,专为**字典序(lexicographic order)比较数组**设计,比手动遍历或 Arrays.equals() + 自定义逻辑更简洁、安全、标准化。它适用于所有基本类型数组和对象数组(要求元素可比较或提供 Comparator),并严格遵循字典序定义:逐元素比较,首个不等处决定结果;若一个数组是另一个的前缀,则较短者更小。
基础用法:同类型数组的直接字典序比较
对相同类型的数组(如 int[]、String[]),直接调用对应重载方法即可:
-
Arrays.compare(int[] a, int[] b)→ 返回负数、0 或正数,语义同Comparable.compareTo() - 类似有
compare(byte[], byte[])、compare(double[], double[])、compare(String[], String[])等 - 元素为
null时,String[]等引用类型数组会抛NullPointerException(除非用带Comparator的版本)
示例:
int[] a = {1, 2, 3};int[] b = {1, 2, 4};
int result = Arrays.compare(a, b); // 返回负数(3
处理 null 元素或自定义顺序:使用 Comparator 版本
当数组元素可能为 null,或需非自然顺序(如忽略大小写、按长度排序)时,用泛型版本 Arrays.compare(T[] a, T[] b, Comparator super T> c):
立即学习“Java免费学习笔记(深入)”;
-
Comparator控制单个元素比较逻辑,Arrays.compare()负责字典序结构 -
null元素可被安全处理(例如用Comparator.nullsFirst(String.CASE_INSENSITIVE_ORDER)) - 即使
T本身未实现Comparable,只要提供Comparator即可比较
示例:
String[] x = {"Apple", null, "cherry"};String[] y = {"apple", "Banana"};
int cmp = Arrays.compare(x, y,
Comparator.nullsFirst(String.CASE_INSENSITIVE_ORDER));
跨类型数组比较?不行——但可统一转为 Comparable 序列
Arrays.compare() 不支持不同组件类型的数组直接比较(如 int[] vs long[]),这是类型安全的设计约束。若需跨类型字典序(如把数字数组转为字符串序列再比),应显式转换:
- 将原始数组映射为
List<comparable></comparable>(如Arrays.stream(arr).boxed().collect(Collectors.toList())) - 再用
list1.compareTo(list2)(ArrayList实现了Comparable,行为即字典序) - 注意:此方式有装箱开销和内存分配,仅在必要时采用
与旧方式对比:为什么推荐 compare() 而非手写循环
相比 JDK 8 及之前常用的手动 for-loop 比较:
- 避免空指针、越界、长度判断错误等常见 bug
- 语义明确:一眼看出是“字典序”,而非“是否相等”或“哈希比较”
- 底层高度优化(尤其基本类型),通常比解释性循环更快
- 天然支持
null安全(通过Comparator重载)和泛型类型约束


















