在 Java 中,Comparator 的“优化”通常可以从性能、可读性、内存占用、稳定性几个角度来考虑。下面按常见场景给你一些实用建议。
list.sort((a, b) -> {
int r = a.getName().length() - b.getName().length();
if (r != 0) return r;
return a.getAge() - b.getAge();
});
如果 getName() / getAge() 是耗时操作(如数据库、反射、字符串处理),会被调用很多次。
Map<MyObj, Integer> lenCache = new HashMap<>();
list.sort((a, b) -> {
int la = lenCache.computeIfAbsent(a, x -> x.getName().length());
int lb = lenCache.computeIfAbsent(b, x -> x.getName().length());
int r = Integer.compare(la, lb);
if (r != 0) return r;
return Integer.compare(a.getAge(), b.getAge());
});
Comparator.comparing(推荐写法)Java 8+ 已经帮你优化了很多:
list.sort(
Comparator
.comparing(MyObj::getName)
.thenComparingInt(MyObj::getAge)
);
nulla - b 溢出)XXXComparators,避免装箱Comparator.comparing(MyObj::getAge) // Integer
Comparator.comparingInt(MyObj::getAge)
类似还有:
comparingLongcomparingDouble在大数据量排序时,避免
Integer装箱能明显提升性能。
Comparator.comparing(
MyObj::getName,
Comparator.nullsLast(Comparator.naturalOrder())
);
Comparator.nullsFirst(Comparator.naturalOrder())
如果排序逻辑很复杂,可以封装成一个可比较的 key:
class SortKey implements Comparable<SortKey> {
int len;
int age;
// compareTo 实现
}
然后:
list.sort(Comparator.comparing(o -> new SortKey(o)));
适合:
list.parallelStream()
.sorted(comparator)
.collect(Collectors.toList());
⚠️ 注意:
sorted 会失去并行优势(仍要全局排序)ORDER BYLong / int[] 原生数组排序return a.getAge() - b.getAge(); // 可能溢出
return Integer.compare(a.getAge(), b.getAge());
| 优化点 | 建议 |
|---|---|
| 重复计算 | 缓存 key |
| 基本类型 | comparingInt |
| 多字段 | thenComparing |
| null | nullsFirst/Last |
| 可读性 | Comparator.comparing |
| 大数据 | 原生数组 / 外部排序 |
如果你能给我具体场景(数据量、对象结构、是否并行、是否频繁排序),我可以给你更针对性的优化方案。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。