java - CompareToBuilder 的这种使用是否被认为效率低下?

标签 java sorting comparator

在同行评审期间,一位开发人员似乎对实现我选择按 3 个属性排序的compareToBuilder 解决方案的想法感到震惊。他的印象是,我的类中的compareTo 方法会为每个单独的比较创建过多数量的比较器,并且应用程序会对性能造成巨大影响。他建议我使用 BeanComparator 和 ComparatorUtils 来链接比较器。

这是我的课:

public class EmployeeComparator implements Comparator<Employee> {

@Override
public int compare(Employee o1, Employee o2) {
    return new CompareToBuilder()
            .append(o1.getJobTitle(), o2.getJobTitle())
            .append(o1.getAge(), o2.getAge())
            .append(o1.getSalary(), o2.getSalary()).toComparison();
}

这是我的实现:

Collections.sort(outputRecordList, Comparator.nullsLast(new EmployeeComparator()));

但是,我实际上不知道这是不是真的。我找不到任何迹象表明这会比使用链式比较器对性能造成重大影响。我仔细研究了 apache 文档,发现这是该类的标准实现( https://commons.apache.org/proper/commons-lang/javadocs/api-3.1/org/apache/commons/lang3/builder/CompareToBuilder.html )。我唯一担心的是,通过添加“Comparator.nullsLast”,我创建了一个怪物。

我在此站点上找到了 CompareToBulder 实现:

http://www.codejava.net/java-core/collections/sorting-a-list-by-multiple-attributes-example

任何解释为什么这是不好的做法或解释 CompareToBuilder 到底在做什么的帮助将不胜感激。

最佳答案

CompareToBuilder 对于您的使用来说似乎相当有效(从查看其源代码来看)。与硬编码的比较相比,它涉及一个额外的实例创建(仅包含一个 int 字段)以及append() 调用(可能由 HotSpot 编译器内联)。即使第一次比较已经决定了结果,它也必须经历所有尾部比较。

以这种方式实现它,然后对系统进行分析。如果 EmployeeComparator 花费大量时间,请再想一想:但我想更快的compareTo() 实现不会有太大帮助。

关于java - CompareToBuilder 的这种使用是否被认为效率低下?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45419385/

相关文章:

java - 如何确保安全并隐藏 .java 文件不被反编译 APK 文件。

java 8 方法引用到 lambda

Java 按所需字符串排序

java - JList 不可显示

java - mediaMetadataRetriever.setDataSource(getBaseContext(),uri)引发非法参数异常

java - 在 Camel CXFRS 中获取当前登录用户的正确方法是什么(使用 spring security)?

Java,对末尾较长条目的ArrayList进行特殊排序

java - 按 ArrayList<Integer> 中的第三个元素对 ArrayList<ArrayList<Integer>> 进行排序

java - 在 Java 中对多语言环境字符串进行排序

java - 如何将 lambda 返回给 thenComparing 方法