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.
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.
È 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
...
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
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.
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.
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
Quando si lavora con operazioni di bit, può essere utile. Rende più ovvio che la rappresentazione binaria sia '0b10000'. –
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'? –