Java: сравнение с компаратором - память и производительность - PullRequest
3 голосов
/ 11 марта 2020

Во время одного из моих интервью меня спросили

В чем разница в производительности между Comparable и Comparator?

Я ответил, что не знаю. Интервьюер сказал:

Если Comparable реализуется классом Employee , когда 5000 объектов Employee создаются и добавляются в ArrayList, их будет 5000 объекты с сравнивать с методами в динамической памяти. Поэтому, если в этом нет крайней необходимости, не используйте Comparable. С Comparator, упомянутые выше издержки памяти устраняются.

Был ли он прав, говоря это?

1 Ответ

5 голосов
/ 11 марта 2020

Этот ответ неверен.

Добавление реализованных интерфейсов или методов не влияет на объем памяти, необходимый для отдельных экземпляров класса.

Прежде всего, концептуально это не имеет смысла.

Реализованные интерфейсы и методы являются информацией для каждого класса. Два экземпляра одного и того же класса всегда будут реализовывать одни и те же интерфейсы и иметь одинаковые методы. Таким образом, для 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 ...");
    }
  }
}

Запуск этого с помощью -Xmx32m с использованием Java 11 создаст для меня около 200000 объектов при каждом запуске (с небольшими вариациями, возможно, из-за деталей G C).

Удаление интерфейса Comparable и / или compareTo метод существенно не меняет это значение.

Вы можете попробовать добавить дополнительные поля или удалить l, что изменит число.

...