A Set
содержит только отдельный элемент (это его природа). Базовая реализация, HashSet
, использует hashCode()
, чтобы сначала найти сегмент, содержащий значения, а затем equals(Object)
, чтобы найти другое значение.
Массивы просты: их hashCode () использует значение по умолчанию, унаследованное от Object
и, следовательно, в зависимости от ссылки. equals(Object)
также совпадает с Object
: он проверяет только идентификатор, то есть: ссылки должны быть равны.
Определено как Java:
public boolean equals(Object other) {
return other == this;
}
Если вы хотите поместить разные массивы, вам придется либо попытать счастья с TreeSet
и правильной реализацией Comparator
, либо обернуть ваш массив, либо использовать List
или другой Set
:
Set<List<Integer[]>> set = new HashSet<>();
Integer[] t = new Integer[]{1, 1};
set.add(Arrays.asList(t));
Integer[] t1 = new Integer[]{1, 1};
set.add(Arrays.asList(t1));
System.out.println(set.size());
Что касается изменчивости объекта, используемого в ключах Set
или Map
:
- поля, используемые
boolean equals(Object)
, не должны быть приглушены, потому что приглушенный объект может быть равен другому. Набор больше не будет содержать отдельных значений.
- , используемые
int hashCode()
, не должны быть отключены для хэш-коллекции (HashSet
, HashMap
), потому что, как сказано выше, они работают, помещая элементы в корзину. Если hashCode () изменится, вполне вероятно, что место объекта в корзине также изменится: тогда Set
будет содержать дважды одинаковую ссылку.
- , используемые
int compareTo(T)
или Comparator::compare(T,T)
, не должны быть отключены по той же причине, что и equals
: SortedSet
не будет знать, что произошло изменение.
Если возникнет такая необходимость, вам придется сначала удалить предмет из набора, а затем изменить его, повторно добавить.