gpt4 book ai didi

Java:Comparable 与 Comparator - 内存和性能

转载 作者:行者123 更新时间:2023-12-02 02:46:49 25 4
gpt4 key购买 nike

在一次采访中,有人问我

What is the performance difference between Comparable and Comparator?

我回答说我不知道​​。面试官说,

If Comparable is implemented by a class Employee, when 5000 Employee objects are created and added in an ArrayList, there will be 5000 objects with compareTo methods in heap memory. So unless absolutely necessary, don't use Comparable. With Comparator, the above mentioned memory overhead is eliminated.

他说得对吗?

最佳答案

这个答案是不正确的。

添加实现的接口(interface)或方法不会影响类的各个实例所需的内存。

首先,从概念上讲,它没有意义。

实现的接口(interface)和方法是每个类的信息。同一类的两个实例将始终实现完全相同的接口(interface)并具有完全相同的方法。因此,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 接口(interface)和/或 compareTo 方法不会显着改变该值。

您可以尝试添加其他字段或删除 l,这更改数字。

关于Java:Comparable 与 Comparator - 内存和性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60637495/

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