java - 匿名内部类——集合排序

标签 java

我正在创建一个比较器作为匿名内部类,我不确定它是否是最好的方法。我在我的代码中只创建了一次,但我不确定每次我对列表进行排序时是否创建了该内部类。例如,在一个应用程序中,如果我使用该比较器调用 sort 方法 10 次,是否会创建十个额外的类?

Collections.sort(originalList, new Comparator<User>() {
    @Override
    public int compare(User o1, User o2) {
        int value1 = o1.getPropertyCode().compareTo(o2.getPropertyCode());
        if (value1 == 0) {
            int value2=o1.getPropertyValue().compareTo(o2.getPropertyValue());
            return value2;
        }
        return value1;
    }
});

对比

Collections.sort(originalList, new SomeComparator());

最佳答案

匿名类由编译器转换为常规类定义,实际上被赋予一个名称,如 OutterClass$1,您不能通过该名称引用该类,但您可以这样做 new Object() {}.class.getName() 看看它总是一样的。每当您的代码遇到有问题的行时,它都只使用 1 个类——无论您是否给它一个明确的名称。您的 2 个选项基本相同。

但是当您阅读直到 Collections.sort(originalList, new 的代码行时,您应该意识到 new 创建了一个新实例(不是类)每次。即它分配内存,初始化事物,..这些都不需要多次,因为创建的比较器对象永远不会不同。

您要做的是像这样将创建的比较器存储在一个字段中(或者像在 Java 自己的源中一样 String.CASE_INSENSITIVE_ORDER )

private static final Comparator<User> USER_COMPARATOR = new Comparator<User>() {
    @Override
    public int compare(User o1, User o2) {
        int value1 = o1.getPropertyCode().compareTo(o2.getPropertyCode());
        if (value1 == 0) {
            int value2=o1.getPropertyValue().compareTo(o2.getPropertyValue());
            return value2;
        }
        return value1;
    }
};
private void someCode() {
    Collections.sort(originalList, USER_COMPARATOR);
}

或者使用 Java 8,您可以将它变成一个 lambda(注意缺少的 new),它也不会每次都创建新实例

Collections.sort(originalList, (o1, o2) -> {
    int value1 = o1.getPropertyCode().compareTo(o2.getPropertyCode());
    if (value1 == 0) {
        int value2=o1.getPropertyValue().compareTo(o2.getPropertyValue());
        return value2;
    }
    return value1;
});

关于java - 匿名内部类——集合排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36991048/

相关文章:

java - 将 1 个字符串元素转换为整数

java - 如何将 CompletableFuture.supplyAsync 与 PriorityBlockingQueue 一起使用?

java - 如何以编程方式检测检查或识别应用程序是否在 Android Go 版本 8.1 设备上运行

java - 如何为 temp (WindowAdapter) 创建或分配方法?

java - jUnit 4.x 中的前后套件执行 Hook

Java : search for multiple fields in an index in elasticsearch

java - 调整某些图像大小时抛出异常 "java.awt.color.CMMException: Invalid image format"...为什么?

java - 将 ZIP 转换为字节数组而不将输出保存到文件

java - PreUpdate 监听器在空更新期间触发

java - eclipse xtext : How can I know if file contain errors