2016-03-09 13 views
11

Qual è la differenza in Hash Map di Java 7 e Java 8 quando entrambi funzionano su un algoritmo di complessità costante? Secondo quanto ho capito, ho cercato le mappe hash in tempo costante generando una chiave hash per un oggetto attraverso la funzione hash.Differenza nella mappa hash in Java 7 e 8

+1

@MDaniyal ha risposto correttamente senza utilizzare la frase che descrive la situazione di due o più elementi con lo stesso hash: "collisione di hash". Se vuoi approfondire le collisioni di hash in generale, ti consiglio di iniziare qui: https://en.wikipedia.org/wiki/Hash_table#Collision_resolution – Jeutnarg

risposta

14

In Java 7 dopo il calcolo di hash da funzione hash se più di un elemento ha stesso hash che vengono cercati da ricerca lineare quindi è complessità è (n). In Java 8 la ricerca viene eseguita dalla ricerca binaria, quindi la complessità diventerà log (n). Quindi, questo concetto è sbagliato che la mappa di hash cerca un oggetto in costante complessità perché non è sempre il caso.

+2

In realtà c'è una soglia, È descritta in JEP180, quando un singolo bucket/bin ha più di TREEIFY_THRESHOLD = 8 voci che saranno convertite in un albero. In Java 7, dove le collisioni sono state ricercate linearmente, c'era una protezione DOS: un Xord seme casuale con gli hash per renderli meno prevedibili. Questa funzione è stata rimossa in Java 8. – eckes

+0

Se approfondiamo l'implementazione, è esattamente quello che hai spiegato @eckes – MDaniyal

4

si potrebbe trovare gli ultimi numeri del Java Specialist newsletter molto utile. Si approfondisce discutendo dell'hashing in Java nel corso degli anni; ad esempio sottolineando che è meglio assicurarsi che le chiavi della mappa implementino Comparable (quando si utilizza Java8).

Problemi correlati