在 Java 中,Comparator 的性能优化通常围绕减少比较开销、避免重复计算、减少对象创建、利用底层机制等方面展开。下面按实战角度总结常见优化手段。
compare() 中做重复计算Collections.sort(list, (a, b) ->
a.getName().length() - b.getName().length());
每次比较都调用 getName() 和 length()。
list.sort(Comparator.comparingInt(a -> a.getName().length()));
或更高效:
class Wrapper {
Person p;
int len;
}
List<Wrapper> ws = list.stream()
.map(p -> { Wrapper w = new Wrapper(); w.p = p; w.len = p.getName().length(); return w; })
.sorted(Comparator.comparingInt(w -> w.len))
.collect(...);
Comparator.comparingInt
Comparator.comparingLong
Comparator.comparingDouble
Comparator.comparing(Person::getAge) // 返回 Integer,会装箱
// 慢
Comparator.comparing(Person::getAddress).thenComparing(Address::getCity)
// 快
Comparator.comparing(p -> p.getAddress().getCity())
链式 thenComparing 会生成多个 Comparator 对象。
static final Comparator<Person> BY_AGE =
Comparator.comparingInt(Person::getAge);
而不是:
list.sort((a, b) -> a.getAge() - b.getAge());
compareTo() 中的复杂逻辑// 慢
a.getName().compareTo(b.getName());
// 快(长度优先)
Integer.compare(a.getName().length(), b.getName().length());
list.sort(comparator); // TimSort 已优化
list.parallelStream()
.sorted(comparator)
.collect(Collectors.toList());
⚠ 注意:
如果性能极端敏感:
int[] ages = ...;
Arrays.sort(ages);
比 List<Person> 快很多。
Comparator.nullsFirst(Comparator.naturalOrder());
但 nullsFirst 有判断成本,明确不可能 null 时不要加。
static final Comparator<Person> CMP =
Comparator.comparingInt(Person::getDeptId)
.thenComparingInt(Person::getAge);
| 优化点 | 建议 |
|---|---|
| 重复计算 | 预计算 |
| 装箱 | 用 Int/Long/Double |
| 对象创建 | 静态常量 |
| 复杂比较 | 简化逻辑 |
| 大数据 | 分字段排序 |
| 极端性能 | 用数组 |
如果你有具体场景(如百万级数据、复杂对象、实时排序),我可以给更针对性的方案。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。