gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 04:46:17 25 4
gpt4 key购买 nike

我正在创建一个比较器作为匿名内部类,我不确定它是否是最好的方法。我在我的代码中只创建了一次,但我不确定每次我对列表进行排序时是否创建了该内部类。例如,在一个应用程序中,如果我使用该比较器调用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com