Java 匿名内部类-集合排序

Java 匿名内部类-集合排序,java,Java,我正在创建一个比较器作为匿名内部类,我不确定这是否是最好的方法。我在代码中只创建了一次,但我不确定的是,每次排序列表时是否都创建了内部类。例如,在应用程序中,如果我使用该比较器调用sort方法10次,是否会创建10个额外的类 Collections.sort(originalList, new Comparator<User>() { @Override public int compare(User o1, User o2) { int value1

我正在创建一个比较器作为匿名内部类,我不确定这是否是最好的方法。我在代码中只创建了一次,但我不确定的是,每次排序列表时是否都创建了内部类。例如,在应用程序中,如果我使用该比较器调用sort方法10次,是否会创建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(原始列表,新比较器(){
@凌驾
公共整数比较(用户o1、用户o2){
int value1=o1.getPropertyCode().compareTo(o2.getPropertyCode());
如果(值1==0){
int value2=o1.getPropertyValue().compareTo(o2.getPropertyValue());
返回值2;
}
返回值1;
}
});
vs


Collections.sort(originalList,newsomecomparator())

视情况而定。如果在方法中有这个比较器,那么每次调用都会实例化一个新的比较器。此外,该比较器将包含对包含类的引用


另一方面,如果将该匿名内部类定义为静态字段,则将只有一个(每个类装入器)。

编译器将匿名类转换为常规类定义,并实际为其命名,如
OutterClass$1
,您不能通过该名称引用该类,但可以执行例如
newobject(){}.class.getName()
来查看它是否始终相同。无论您的代码何时到达有问题的行,它都只使用一个类——不管您是否给它一个显式的名称。您的两个选项基本相同

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

您要做的是将创建的比较器存储在类似这样的字段中一次(或者类似于Java自己的源代码中)


代码值千言万语!展示给我们看!如果“创建十个额外的类”是指10个实例,那么答案是肯定的。(这就是new关键字的作用)…但是这10个额外的实例真的对性能有显著的影响吗?在特定的情况下,可能是这样;一般来说,不是这样。@user2296988如果你的意思是你有10个不同的匿名类,你认为这也有区别吗?一旦它们被类加载器加载,它只是创建实例。这是类似的问题还有,如何将其声明为静态字段?就像静态初始化块一样?如果要将其转换为lambda,那么最好编写更紧凑的
比较(User::getPropertyCode)。然后比较(User::getPropertyValue)
。太好了,我不知道这在字符串类中使用。这应该变得更流行,就像设计模式一样。并不是说额外的类总是会有内存问题,但我确信这对我的情况很有帮助。@LouisWasserman的缺点是,这不会导致像lambda这样的静态字段,而是每次使用取消运行。可能不是在JIT得到它的手之后。但无论如何,在这种情况下,我会将它分配给一个静态字段
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);
}
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;
});