in Java 8 java.util.HashMap ho notato un cambiamento from:Passare alla funzione di hash HashMap in Java 8
static int hash(int h) {
h ^= (h >>> 20)^(h >>> 12);
return h^(h >>> 7)^(h >>> 4);
to:
static final int hash(Object key) {
int h;
return (key == null) ? 0 : (h = key.hashCode())^(h >>> 16);
Risulta dal codice che la nuova funzione è un semplice XOR
dei 16 bit inferiori con il 16 superiore che lascia invariati i 16 bit superiori, in contrapposizione a diversi cambiamenti nella precedente implementazione, e dai commenti che questo è meno efficace nell'assegnare i risultati delle funzioni hash con ah Elevato numero di collisioni in bit inferiori a diversi bucket, ma consente di risparmiare i cicli della CPU dovendo eseguire meno operazioni.
L'unica cosa che ho visto nelle note di rilascio era lo change dagli elenchi collegati agli alberi bilanciati per archiviare le chiavi collidenti (che pensavo avrebbero potuto cambiare il tempo necessario per calcolare un buon hash), ero specificamente interessato a vedere se ci fosse qualche impatto sulle prestazioni atteso da questo cambiamento sulle mappe hash di grandi dimensioni. C'è qualche informazione su questo cambiamento, o qualcuno con una migliore conoscenza delle funzioni di hash ha un'idea di quali potrebbero essere le implicazioni di questo cambiamento (se c'è, forse ho solo frainteso il codice) e se c'era bisogno di generare hash codici in un modo diverso per mantenere le prestazioni durante il passaggio a Java 8?
Quando la dimensione della "catena hash" supera un limite, passa a "albero bilanciato" dagli elenchi collegati per essere specifico. In tal modo, le operazioni nel caso peggiore richiedono tempo O (n) anziché O (n). – darkdefender27
@ darkdefender27 - il tuo commento non ha senso. 1) Come è O (n) migliore di O (n)? 2) In realtà va a O (logn)! 3) Questo è quello che ho detto nella mia risposta ... –
Oh mi dispiace, intendevo O (log n). La tua risposta ha perfettamente senso. Stavo solo cercando di affermare che passa all'albero di ricerca binaria "bilanciato". – darkdefender27