2016-03-16 15 views
7

Il codice di OpenJDK per java.util.HashMap include la seguente riga:Perché usare 1 << 4 invece di 16?

static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16 

Perché 1 << 4 usato qui, e non 16? Sono curioso.

+6

Per mostrare esplicitamente che è una potenza di due, come il commento sopra di esso in 'HashMap.java' dice:'/* La capacità iniziale predefinita - DEVE essere una potenza di due. */' – khelwood

+0

Quando si lavora con operazioni di bit, può essere utile. Rende più ovvio che la rappresentazione binaria sia '0b10000'. –

+2

E non ci sono altri bit-flag impostati in questo modo? È un modo molto semplice per scrivere i bit-flag, specialmente quando si raggiungono numeri di bit più alti. Ad esempio, cosa preferiresti scrivere, "1 << 31" o "2147483648'? –

risposta

17

È per sottolineare che il numero è un potere di due, e non una scelta completamente arbitraria. Spinge quindi gli sviluppatori a sperimentare numeri diversi per modificarlo in altri numeri nel modello (ad es., 1 << 3 o 1 << 5, anziché 25) in modo che non infrangano il codice. C'è un commento just above:

/** 
* The default initial capacity - MUST be a power of two. 
*/ 
static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16 

la capacità di ogni java.util.HashMap è sempre una potenza di due. E 'progettato in questo modo perché che consente l'uso di un bit a bit ed operare rapidamente per avvolgere codice hash di ogni tasto nella gamma della capacità del tavolo, come si può vedere in methods that access the table:

final Node<K,V> getNode(int hash, Object key) { 
    Node<K,V>[] tab; Node<K,V> first, e; int n; K k; 
    if ((tab = table) != null && (n = tab.length) > 0 && 
     (first = tab[(n - 1) & hash]) != null) { /// <-- bitwise 'AND' here 
     ... 
+1

Vorrei aggiungere che questo tipo di best practice è correlato alla produzione di un codice più esplicativo, ed evita ulteriormente l'uso di numeri magici (http://stackoverflow.com/questions/47882/what-is-a-magic -numero-e-perché-è-da-cattivo). Mentre qui c'è un uso costante con un nome appropriato, il valore è anche più reveiling in questo modo. – jotadepicas

8

non riesco a leggere il la mente dello sviluppatore, ma facciamo cose del genere per indicare una relazione tra i numeri.

confrontare questo:

int day = 86400;

vs

int day = 60 * 60 * 24; // 86400

Il secondo esempio mostra chiaramente il rapporto tra i numeri, e Java è abbastanza intelligente per compilare che come una costante.

0

Penso che il motivo è che lo sviluppatore può modificare molto facilmente il valore (in base a JavaDoc '/ * La capacità iniziale predefinita - DEVE essere una potenza di due. * /') Ad esempio a 1 << 5 o 1 << 3 e non lo fa Non c'è bisogno di fare calcoli.