2013-08-06 29 views
20

Mi piace un HashSet <>() e utilizzare questo entusiasmo durante l'inizializzazione questo con il costruttore di default:Perché inizializzare HashSet <> (0) su zero?

Set<Users> users = new HashSet<>(); 

Ora, il mio creatore fagioli automatica (strumenti di JBoss) inizializza questo come:

Set<Users> users = new HashSet<>(0); 

Perché lo zero? L'API mi dice che questa è la capacità iniziale, ma qual è il vantaggio di mettere questo a zero? È questo consigliato?

risposta

21

Il default initial capacity is 16, quindi passando 0 è possibile salvare alcuni byte di memoria se si finisce per non mettere nulla nel set.

A parte questo non vi è alcun vantaggio reale; quando passi 0 il set viene creato con una capacità di 1 e non appena aggiungi qualcosa, dovrà essere ridimensionato.

+0

@PeterLawrey Il minimo è anche 16? Quindi 0 non dovrebbe funzionare? – Aquillo

+0

@PeterLawrey, come mai? Non è 2? –

+0

+1 Spiacenti, per questo costruttore, il minimo è 1. –

3

If you see docs

C'è qualche indizio.

iterazione di questa serie richiede tempo proporzionale alla somma delle dimensioni dell'istanza HashSet (il numero di elementi) più la "capacità" dell'istanza supporto HashMap (il numero di bucket). Pertanto, è molto importante non impostare la capacità iniziale troppo alta (o il fattore di carico troppo basso) se le prestazioni di iterazione sono importanti.

6

HashSet dati uso immagazzinare HashMap:

public HashSet(int initialCapacity) { 
map = new HashMap<E,Object>(initialCapacity); 
} 

mentre l'initialCapacity = 0,

public HashMap(int initialCapacity, float loadFactor) { 
    .... 
    // Find a power of 2 >= initialCapacity 
    int capacity = 1; 
    while (capacity < initialCapacity) 
     capacity <<= 1; 
} 

la capacità HashMap è 1.

ma se il costruttore di difetto di uso:

public HashMap() { 
    this.loadFactor = DEFAULT_LOAD_FACTOR; 
    threshold = (int)(DEFAULT_INITIAL_CAPACITY * DEFAULT_LOAD_FACTOR); 
    table = new Entry[DEFAULT_INITIAL_CAPACITY]; 
    init(); 
} 

la capacità HashMap è 16*0.75.

Quindi, new HashSet<>(0) salvare un memroy quando init.

5

Questo lo imposterà al minimo.

Molto probabilmente questo viene utilizzato per disattivare gli analizzatori di codice che possono presentare un reclamo se non è stata impostata una capacità iniziale per le raccolte. Impostandolo su 0 è sufficiente impostarlo al minimo.

Non è molto di ottimizzazione perché non appena si aggiunge una voce, il fattore di carico di 0,7 renderà la capacità 2, ricreare il Map.Entry[] nel processo.

0

Il fattore di carico iniziale di HashMap è 16. Quando HashMap contiene i dati di 12 record che corrispondono al 75% della dimensione iniziale. quindi HashMap aumenta le sue dimensioni.

Quindi qui impostiamo la capacità iniziale come 0 passandola in Constructor.