Как избежать медленных равных для интернированных объектов?
Я создаю несколько довольно больших объектов, и многие из них являются дубликатами. Поэтому я подумал об использовании гуавы 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
}
}
В качестве следующего шага вы можете рассмотреть обертывание "связки других вещей" в (приватный) метод, который будет стимулировать использование равных. Трудно понять, когда это работает, но...