2016-07-07 33 views
5

Il mio amico mi stava chiedendo di un'interrogazione oggi.Può essere evitato il rehashing in hashmap?

C'è un modo per prevenire/evitare Hashmap? L'intervistatore ha dato un indizio che c'è un gancio con il quale rimaneggiamento può essere evitato

Ho provato a guardare nel codice HashMap e si presenta come non appena colpisce il fattore di carico è rimaneggiamenti

Impostazione del fattore di carico per un valore più alto può solo ritardare il processo di rimaneggiamento

sono confuso se a tutto il suo possibile per evitare che rimasticare

Se qualcuno mi può puntare nella direzione giusta può aiutare

+0

Fai la capacità iniziale maggiore del numero massimo di elementi che verranno memorizzati diviso per il fattore di carico? – immibis

+0

Sì, sintonizzando il fattore di carico. E sì, è possibile evitare completamente se sai quanti elementi verranno aggiunti. –

+6

Sigh ... un altro intervistatore che vuole verificare se i potenziali clienti hanno memorizzato l'origine del runtime Java ... Non vedo proprio il motivo di porre domande come questa. – ajb

risposta

5

Sì, può essere av oide se conosci in anticipo la dimensione della tua hashmap.

Set loadFactor = 1 (valore di default è 0,75)

initialCapacity = size of hashmap + 1 (valore di default è 16).

Utilizzare il seguente costruttore per istanziare la vostra hashmap

public HashMap(int initialCapacity, float loadFactor) 

Ciò funziona perché nel frammento di codice di seguito dalla classe HashMap, la condizione (size >= threshold) non sarà mai soddisfatto, quindi la tabella hash non è mai ridimensionato.

void addEntry(int paramInt1, K paramK, V paramV, int paramInt2) 
{ 
    if ((size >= threshold) && (null != table[paramInt2])) 
    { 
     resize(2 * table.length); 
     paramInt1 = null != paramK ? hash(paramK) : 0; 
     paramInt2 = indexFor(paramInt1, table.length); 
    } 
    createEntry(paramInt1, paramK, paramV, paramInt2); 
}