Java:可比与比较器-内存和性能

在我的一次采访中,有人问我

可比和性能之间的性能差异是什么 比较器?

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

如果Comparable由类 Employee 实现,则为5000 创建员工对象并将其添加到ArrayList中, 堆内存中具有 compareTo 方法的5000个对象。所以除非 绝对必要,请勿使用Comparable。有了Comparator, 消除了上述内存开销。

他说的正确吗?

asas8520 回答:Java:可比与比较器-内存和性能

该答案不正确。

添加已实现的接口或方法不会影响类的单个实例所需的内存。

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

实现的接口和方法是每个类的信息。同一类的两个实例将始终实现完全相同的接口,并具有完全相同的方法。因此,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,这将 更改号码。

本文链接:https://www.f2er.com/2664330.html

大家都在问