La réponse que vous cherchez peut-être se résume au fait que le hashmap de sauvegarde fait correspondre les éléments de l'ensemble à la valeur PRESENT
qui est défini dans HashSet.java comme suit :
private static final Object PRESENT = new Object();
Dans le code source de HashMap.put
nous avons :
386 public V put(K key, V value) {
387 if (key == null)
388 return putForNullKey(value);
389 int hash = hash(key.hashCode());
390 int i = indexFor(hash, table.length);
391 for (Entry<K,V> e = table[i]; e != null; e = e.next) {
392 Object k;
393 if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
394 V oldValue = e.value;
395 e.value = value;
396 e.recordAccess(this);
397 return oldValue;
398 }
399 }
400
401 modCount++;
402 addEntry(hash, key, value, i);
403 return null;
404 }
Comme la clé en question existe déjà, nous prendrons le rendement anticipé à la ligne 397. Mais vous pourriez penser qu'une modification est apportée à la carte à la ligne 395, dans laquelle il semble que nous modifions la valeur d'une entrée de la carte. Cependant, la valeur de value
es PRESENT
. Mais parce que PRESENT
est statique et finale, donc il n'y a qu'une seule instance de ce type ; et donc l'affectation e.value = value
ne modifie pas du tout la carte, et donc le jeu, en fait !
Mise à jour :
Une fois qu'un HashSet
est initialisé.
- Tous les éléments qu'il contient sont stockés sous forme de clés dans un fichier de type HashMap
- Toutes les valeurs que HashMap
n'ont qu'un seul objet qui est PRESENT
qui est un champ statique dans HashSet
1 votes
Félicitations pour avoir cherché le code source pour
HashSet.add
. Avez-vous cherché la source deHashMap.put
?