先澄清一个常见误解:Java 的 Comparator 本身并不是“稳定或不稳定”的概念,稳定/不稳定说的是排序算法,而不是 Comparator。
下面分点说明:
[A(1), B(1), C(2)] 按值排序后,A 仍在 B 前Comparator 只是“比较规则”Comparator 只告诉排序算法:
两个元素谁大谁小
它不决定排序是否稳定。
list.sort((a, b) -> a.value - b.value);
这里稳不稳定,取决于 list.sort(...) 用的是哪种排序算法。
Collections.sort(List)List.sort(Comparator)Arrays.sort(Object[])底层用的是 TimSort(归并排序变种),稳定
List<User> list = ...
list.sort(Comparator.comparing(User::getAge));
// 稳定
Arrays.sort(int[] / long[] / double[])(基本类型数组)底层是 Dual-Pivot Quicksort,不稳定
int[] arr = {3, 1, 2};
Arrays.sort(arr); // 不稳定(但基本类型无所谓)
基本类型没有“对象身份”,所以不稳定也没影响
Comparator 不稳定?常见原因:
int[] arr = ...
Arrays.sort(arr); // 不稳定
Comparator 里写了“非确定逻辑”Comparator.comparing(x -> Random.nextInt())
这会让排序结果看起来“乱”,但不是算法不稳定。
list.sort(byB);
list.sort(byA); // 会破坏 byB 的顺序
✅ 正确做法:
list.sort(
Comparator.comparing(User::getA)
.thenComparing(User::getB)
);
Comparator不负责稳定性,排序算法才负责
Java 对象排序是稳定的,基本类型数组排序是不稳定的
如果你有具体代码“看起来不稳定”,可以贴出来,我帮你定位原因。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。