2016-02-27 22 views
6

Capisco HashSet in base a HashMap, poiché sono piuttosto simili. Rende il codice più flessibile e riduce al minimo lo sforzo di implementazione. Tuttavia, una variabile di riferimento in HashSet Entry sembra essere inutile per me se la classe proibisce l'elemento null, quindi l'intera Entry non ha senso. Nonostante ciò, un Entry accetta 24 byte di memoria/elemento, mentre un singolo array con gli elementi dell'insieme richiederebbe solo 4 byte/elemento se le mie cifre sono corrette. (a parte l'intestazione dell'array)Prestazioni Java HashSet

Se la mia argomentazione è corretta, i vantaggi superano davvero questo risultato?

(se sbaglio, avrei imparato da esso aswell)

+1

Un singolo array non sarebbe un HashSet. Come avresti O (1) contains() con un array semplice? –

+2

@JBNizet Il rilevamento lineare (o l'indirizzamento generalmente aperto) funziona con un solo array. Sono anche curioso di sapere quale sia stata la decisione di progettazione, ma non sono sicuro se troveremo l'autore qui per segnalare ;-) –

+1

@JBNizet Puoi facilmente implementare diversi tipi di tabelle hash in un array, ad esempio cuculo, lineare, ecc. ... EDIT: lineare non ha O (1) contiene(), ma cucù fa –

risposta

1

Anche se questa domanda si basa opinione-in primo luogo, cercherò di riassumere alcuni punti sul tema:

  • HashSet apparve in Java 1.2 molti anni fa. È difficile indovinare ora le ragioni esatte delle decisioni di progettazione prese in quel momento, ma chiaramente Java non è stato utilizzato per applicazioni con carichi elevati; le prestazioni hanno avuto meno ruolo della semplicità.
  • Hai ragione che il numero HashSet non è ottimale nella sua memoria. Il problema è noto, l'errore JDK-6624565 è registrato e le discussioni allo core-libs-dev vengono tenute di volta in volta. Ma questo è un blocco per molte applicazioni del mondo reale? Probabilmente no.
  • Per quelle applicazioni non comuni in cui l'utilizzo della memoria HashSet non è accettabile, esistono già buone alternative, come il valore di prova THashSet.
  • Si noti che gli algoritmi di indirizzamento aperto hanno i loro svantaggi, ad es. degrado significativo delle prestazioni con fattori di carico vicini a 1; difficoltà di rimozione degli elementi. Vedi lo related answer.