Я определил подинтерфейс java.util.Collection
, который фактически является мультисетным (так называемый мешок). Она может не содержать null
элементов, хотя это и не имеет решающего значения для моего вопроса. Равноценный договор, определенный интерфейсом, как и следовало ожидать:
obj instanceof MyInterface
obj
содержит те же элементы, что и this
(по equals
)obj
содержит одинаковое количество дубликатов для каждого элементаТеперь я хочу написать свой метод hashCode
. Моей первоначальной идеей было:
int hashCode = 1;
for( Object o : this ) {
hashCode += o.hashCode();
}
Однако, я заметил, что com.google.common.collect.coltiset
(из Guava) определяет хэш-код следующим образом:
int hashCode = 0;
for( Object o : elementSet() ) {
hashCode += ((o == null) ? 0 : o.hashCode()) ^ count(o);
}
Мне кажется странным, что пустой Multiset будет иметь хэш-код 0, но, что более важно, я не понимаю преимущества ^ count(o)
по сравнению с простым сложением хэш-кодов каждого дубликата. Может быть, речь идет о том, чтобы не вычислять один и тот же хэш-код более одного раза, но тогда почему бы не * count(o)
?
Мой вопрос: что было бы эффективным вычислением хэш-кода? В моем случае счет для элемента не гарантированно будет дешевым.