Java中的内联比较器与自定义比较器

135*_*355 10 java performance comparator

排序列表时,使用java Comparator内联(使用匿名内部类)与实现单独的自定义Comparator类之间是否有任何性能差异?

1.

public class SortByErrorComparator implements Comparator<WorkflowError> {
    public int compare(WorkflowError obj1, WorkflowError obj2) {
        return obj1.getErrorCode().compareTo(obj2.getErrorCode());
    }
}
Collections.sort(list, new SortByErrorComparator()) ;
Run Code Online (Sandbox Code Playgroud)

2.

Collections.sort(list, new Comparator<WorkflowError>() {
    public int compare(WorkflowError obj1, WorkflowError obj2) {
        return obj1.getErrorCode().compareTo(obj2.getErrorCode());
    }
});
Run Code Online (Sandbox Code Playgroud)

此外,何时compare()调用该方法?

Boh*_*ian 13

还有选项3 - lambda Function:

Collections.sort(list, (a, b) -> a.getErrorCode().compareTo(b.getErrorCode()));
Run Code Online (Sandbox Code Playgroud)

根据这个基准数据,它应该快2倍左右.

......或(感谢@JB Nizet)选项4:

list.sort(Comparator.comparing(WorkflowError::getErrorCode))
Run Code Online (Sandbox Code Playgroud)

  • 如果您正在使用lambdas,那么您使用的是Java 8.如果您使用的是Java 8,则可以使用`list.sort(Comparator.comparing(WorkflowError :: getErrorCode)) (4认同)
  • 为什么lambda应该更快?您链接的帖子告诉匿名类和lambda之间没有性能差异. (2认同)

Era*_*ran 3

这两种变体之间不应该有任何性能差异,因为匿名类应该生成与常规类相同的字节代码(假设它们具有相同的源代码)。唯一的区别是它们有一个生成的名称。

每当需要比较要排序的 List 的两个元素时,compare就会调用该方法。Collections.sort

  • 对于没有“不应该”和“应该”的*答案*,您可能已经生成了字节码分析;-)) (3认同)