在我的一次采访中,有人问我
可比和性能之间的性能差异是什么 比较器?
我回答我不知道。面试官说,
如果Comparable由类 Employee 实现,则为5000 创建员工对象并将其添加到ArrayList中, 堆内存中具有 compareTo 方法的5000个对象。所以除非 绝对必要,请勿使用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
,这将 更改号码。