Java排序应优先用Arrays.sort()处理数组、Collections.sort()处理List,自定义规则用Comparator;手写冒泡仅限教学;需注意null值处理和基本类型降序限制。

Java里写简单排序程序,核心不是“选哪个算法”,而是“根据场景选对实现方式”——数组排序用 Arrays.sort(),集合排序用 Collections.sort(),自定义规则就补 Comparator,硬要手写才碰冒泡或快排。
用 Arrays.sort() 排基本类型和字符串数组
这是最常用、最稳的选择。它对 int[]、double[]、String[] 等内置类型做了高度优化,底层混合了双轴快排(基本类型)和 TimSort(对象数组),性能和稳定性都远超手写。
常见错误是传错类型:比如把 List 直接丢给 Arrays.sort(),会报 Cannot resolve method 'sort(java.util.List)' ——因为这个方法只认数组。
-
int[] nums = {3, 1, 4, 1, 5}; Arrays.sort(nums);→ 升序完成 -
String[] words = {"banana", "apple", "cherry"}; Arrays.sort(words);→ 按字典序升序 - 降序?基本类型不支持直接降序,得转成包装类数组再用
Comparator.reverseOrder()
用 Collections.sort() 排 List 并自定义顺序
当你手里是 ArrayList 或 LinkedList,别转数组再排,直接用 Collections.sort()。它要求元素实现 Comparable,否则必须显式传 Comparator。
立即学习“Java免费学习笔记(深入)”;
容易踩的坑是误用匿名内部类写法导致语法臃肿,Java 8+ 强烈推荐用 Lambda:
-
List→ 默认升序list = Arrays.asList(3, 1, 4); Collections.sort(list); -
Collections.sort(list, (a, b) -> b - a);→ 降序(注意整数溢出风险,更安全用Integer.compare(b, a)) -
Collections.sort(list, Comparator.reverseOrder());→ 同样降序,语义清晰
手写冒泡排序只适合教学或极特殊约束场景
真在生产代码里写冒泡,除非面试被要求、或嵌入式环境连 java.util 都不让用。它时间复杂度 O(n²),1000 个元素就要百万级比较,而 Arrays.sort() 对 1000 个 int 通常不到 1ms。
如果非写不可,注意边界判断和提前退出逻辑,否则纯浪费 CPU:
public static void bubbleSort(int[] arr) {
int n = arr.length;
for (int i = 0; i < n - 1; i++) {
boolean swapped = false;
for (int j = 0; j < n - 1 - i; j++) {
if (arr[j] > arr[j + 1]) {
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
swapped = true;
}
}
if (!swapped) break; // 没交换说明已有序,直接退出
}
}排序稳定性与 null 值处理是实际项目里的暗礁
Arrays.sort() 对对象数组(如 String[])是稳定排序,相同元素相对位置不变;但对 int[] 这种基本类型,“稳定”无意义。而 Collections.sort() 默认也稳定。
真正容易崩的是 null 值——Arrays.sort(new String[]{"a", null, "b"}) 直接抛 NullPointerException。解决办法只有两个:
- 预处理:用
list.removeIf(Objects::isNull)或过滤流.filter(Objects::nonNull) - 自定义
Comparator显式约定null排前面还是后面,例如:Comparator.nullsFirst(String::compareTo)
没处理 null 的排序代码,在测试数据干净时跑得飞起,一进真实环境就挂,这种问题往往拖到上线后才暴露。










