Во-первых, давайте исправить equals
реализацию, потому что это неправильно: вместо того, чтобы сравнивать элементы равенства попарно, чеках кода каждый элемент первого набора против каждого элемента второго набора. Таким образом, единственный случай, когда два набора считаются равными по этой схеме, состоит в том, что оба набора содержат ровно один элемент, а элементы, которые они содержат, одинаковы.
Вы должны сделать два итератора и объединить их в одном цикле. Теперь вы можете сравнить элементы, возвращаемые первым итератором, с элементами, возвращаемыми вторым итератором, и вернуть false
, если они не совпадают.
Теперь давайте хэш-код: теоретически, можно просто сложить отдельные хэш-коды ваших элементов, и это будет действительным реализация hashCode()
:
public int hashCode() {
int res = 0;
for(Object r : g.getcontents()) {
res += r.hashCode();
}
return res;
}
Однако, это не самый лучший хэш-код, который вы могли бы сделать, потому что два набора с различным порядком будут иметь один и тот же хэш-код. Лучший подход заключается в умножении предыдущее значение по простому числу (31 является типичным примером) перед добавлением следующего хэш-код к ней, как это:
public int hashCode() {
int res = 0;
for(Object r : g.getcontents()) {
res = 31 * res + r.hashCode();
}
return res;
}
Наконец, записочку о коллекциях и их хэш-кодов : основная цель переопределения хеш-кода состоит в том, чтобы вы могли использовать свой объект в качестве ключа в хэш-коллекции (хеш-набор или хэш-карта). Тем не менее, вы должны быть предельно осторожны с использованием изменяемых объектов, таких как наборы и списки, в качестве ключей в картах или наборах, поскольку мутация ключа, который был помещен в контейнер, уже поставит под угрозу структурную целостность вашего контейнера на основе хэша.
Если вы не хотите помещать этот набор в другой HasSet или HashMap, вам не нужно переопределять hashCode. – TwilightSun
Почему вы завертываете Set? –
@ TwilightSun.I не будет. Это хорошо знать! Если бы я сделал, как бы я переопределить его? – user3236409