Я прочитал исходный код и понял, как он работает, поэтому мне нужна помощь
Прежде всего
Набор — это набор четко определенных и отдельных объектов.
Таким образом, не возникает вопроса о добавлении повторяющихся значений. Но если вам интересно понять, как java достигает/реализует это ограничение, вы можете начать копаться в исходном коде.
HashSet поддерживается HashMap, что означает, что он делегирует такие операции, как добавление, удаление и т. Д., HashMap
. Теперь, когда вы вызываете set.add("a");
, затем
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
вызывается, который, в свою очередь, вызывает HashMap#put
public V put(K key, V value) {
return putVal(hash(key), key, value, false, true);
}
Метод put
сначала вычисляет хеш-код объекта, используя
static final int hash(Object key) {
int h;
return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}
Как только hashCode вычисляется, он вызывает
final V putVal(int hash, K key, V value, boolean onlyIfAbsent, boolean evict)
внутри этого метода он помещает значение, потому что это условие
if ((p = tab[i = (n - 1) & hash]) == null)
истинно, а затем увеличивает modCount
(в котором хранится количество структурных изменений HashMap), проверяет, нужно ли нам resize
карту, а затем вызывает afterNodeInsertion
и возвращает null
Теперь, когда вы вызываете set.add("b");
, снова запускается та же логика, но на этот раз условие внутри метода final V putVal
if (p.hash == hash && ((k = p.key) == key || (key != null && key.equals(k))))
выполняется, и в связи с этим код
if (e != null) { // existing mapping for key
V oldValue = e.value;
if (!onlyIfAbsent || oldValue == null)
e.value = value;
afterNodeAccess(e);
return oldValue;
}
обнаруживает существующее сопоставление и, таким образом, возвращает oldValue
. Следовательно, предотвращение добавления повторяющегося значения.
person
sol4me
schedule
05.10.2014
HashSet
.. ПОЧЕМУ?! - person Maroun   schedule 05.10.2014Set
, если хотите, чтобы он содержал дубликаты? Почему бы вам не использоватьList
вместо этого? - person msrd0   schedule 05.10.2014