Non sono sicuro di chiamarlo una coincidenza è la risposta giusta. Non c'è alcuna possibilità in gioco. Risulterà dalle funzioni di hash utilizzate, dai piccoli valori inseriti nell'HashSet e dalla piccola quantità di elementi inseriti nel Set.
Per intero, hashCode()
è il valore int del numero intero.
HashMap (e HashSet) eseguono un hashing aggiuntivo sul valore restituito da hashCode
, ma questo hashing aggiuntivo non modifica il valore per numeri così piccoli come aggiunti a HashSet.
Infine, il bucket su cui ogni intero è inserito è il codice hash modificato che modula la capacità di HashSet. La capacità iniziale di un HashSet/HashMap è 16.
Pertanto 2 è aggiunto alla benna 2, 7, è aggiunto tazza 7, ecc ...
Quando eseguire iterazioni su elementi del HashSet, i bucket vengono visitati in ordine e, poiché ciascun bucket ha al massimo un singolo elemento, i numeri vengono ordinati.
Ecco come il segmento viene calcolato:
int hash = hash(key.hashCode());
int i = indexFor(hash, table.length);
static int hash(int h) { // for the small integers you put in the set, all the values being
// xored with h are 0, so hash(h) returns h
h ^= (h >>> 20)^(h >>> 12);
return h^(h >>> 7)^(h >>> 4);
}
static int indexFor(int h, int length) {
return h & (length-1); // table.length is the initial capacity - 16,
// so for h <= 15, indexFor(h,table.length)=h
}
Pertanto, i secchi di 2,7,3,9,6 2,7,3,9,6 sono rispettivamente.
Il ciclo potenziato per l'iterazione su HashSet visita i bucket in ordine e per ciascun segmento scorre sopra le voci (che sono memorizzate in un elenco collegato). Pertanto, per il tuo input, 2 viene visitato per primo, seguito da 3, 6, 7 e 9.
Se si aggiungono i numeri superiori a 15, sia il metodo e il metodo hash
indexFor
(supponendo che non è stato modificato la capacità di default del HashSet) impedirebbe i numeri da essere ordinati quando iterato per l'iteratore HashSet.
Si potrebbe provare ad aggiungere i numeri in un ordine diverso e vedere se l'uscita rimane la stessa. Ma come dicono le risposte, non c'è alcuna garanzia circa l'ordine, e quindi è solo una coincidenza :) – MinecraftShamrock
Contrariamente alle attuali risposte, non è davvero un incidente o una coincidenza; ma scoprirai che non accadrà generalmente se metti alcuni numeri più grandi nel set, o una combinazione di numeri negativi e positivi. –