Как избежать медленных равных для интернированных объектов?

Я создаю несколько довольно больших объектов, и многие из них являются дубликатами. Поэтому я подумал об использовании гуавы Interner для них и всегда работают только с интернированным объектом (т. е. каждый объект интернируется сразу после создания).

Мне пришло в голову, что equals из этих объектов довольно медленно (и часто используется), и что я на самом деле никогда не нуждаюсь в этом, как a.equals(b) эквивалентно a == b после интернирования. К сожалению, Interner сам использует equals поэтому я должен переопределить его для одноразового использования.

Интересно, есть ли простой способ получить мои равные и съесть это?


Отказ от ответственности: я знаю о корне всего зла, и я не уверен, что оптимизация в этом месте стоит усилий. Тем не менее, мне интересно, если у вышеуказанной проблемы есть хорошее решение.

2 ответа

Это зависит от того, как вы используете, где вы хотите получить снижение производительности.

Если вы собираетесь проводить много сравнений после создания объекта и знаете, что у вас часто встречаются дубликаты, тогда шаблон "мухи" может иметь смысл, поскольку все ваши сравнения после создания могут быть выполнены с помощью равенства ссылок.

Другая вещь, чтобы рассмотреть, является космической эффективностью; Вы упоминаете, что они большие объекты. Что важнее? Если вы экономите тонну памяти за счет объединения объектов, это может быть победой.

Профилирование вашего кода с использованием обоих подходов также может помочь вам принять это решение.

Редактировать, чтобы добавить: Тем не менее, я удивлен, что их стажер полагается исключительно на equals(), В моей голове было бы гораздо больше смысла полагаться на hashcode() и только использовать equals() для столкновений.

Если ваш метод equals использует "a == b" внутри, это достаточно быстро?

class BigObject {
  public boolean equals(Object o) {
    if(o == this) return true;
    if(o == null) return false;
    // a bunch of other stuff
  }
}

В качестве следующего шага вы можете рассмотреть обертывание "связки других вещей" в (приватный) метод, который будет стимулировать использование равных. Трудно понять, когда это работает, но...

Другие вопросы по тегам