[英]Java: Comparable vs Comparator - Memory & Performance
在我的一次采访中,我被问到
Comparable 和 Comparator 之间的性能差异是什么?
我回答说不知道。 面试官说,
如果 Comparable 由类Employee 实现,当创建 5000 个 Employee 对象并将其添加到 ArrayList 中时,堆内存中将有 5000 个具有compareTo方法的对象。 所以除非绝对必要,否则不要使用 Comparable。 使用 Comparator,消除了上述内存开销。
他这样说对吗?
这个答案是不正确的。
添加已实现的接口或方法不会影响类的各个实例所需的内存。
首先,在概念上它没有意义。
实现的接口和方法是每个类的信息。 同一个类的两个实例将始终实现完全相同的接口并具有完全相同的方法。 因此,JVM 存储每个对象的信息是没有意义的。
其次,您可以使用如下示例代码轻松验证:
public class MyClass implements Comparable<MyClass> {
private final long l;
MyClass(long l) {this.l = l;}
@Override
public int compareTo(MyClass o) {
return 0;
}
public static void main(String[] args) {
long l = 0;
try {
var list = new ArrayList<MyClass>();
while (true) {
list.add(new MyClass(l++));
}
} catch (OutOfMemoryError e) {
System.out.println("Created " + l + " objects before things went south ...");
}
}
}
使用 Java 11 使用-Xmx32m
运行此程序将为我在每次运行时创建大约 200000 个对象(略有不同,可能是由于 GC 细节)。
删除Comparable
接口和/或compareTo
方法不会显着改变该值。
您可以尝试添加其他字段或删除l
,这将更改数字。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.