2016-03-16 26 views
7

Der OpenJDK-Code für java.util.HashMap enthält die folgende Zeile:Warum 1 << 4 statt 16?

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

Warum 1 << 4 hier verwendet wird, und nicht 16? Ich bin neugierig.

+6

Um explizit zu zeigen, dass es eine Potenz von zwei ist, wie der Kommentar darüber in 'HashMap.java' sagt:'/* Die Standard-Anfangskapazität - MUSS eine Potenz von Zwei sein. */' – khelwood

+0

Wenn Sie mit Bitoperationen arbeiten, kann es nützlich sein. Es macht es offensichtlicher, dass die Binärdarstellung "0b10000" ist. –

+2

Und es gibt keine anderen Bit-Flags, die so gesetzt werden? Es ist eine sehr einfache Möglichkeit, Bit-Flags zu schreiben, besonders wenn Sie zu höheren Bit-Zahlen kommen. Was würden Sie lieber schreiben, '1 << 31' oder' 2147483648'? –

Antwort

17

Es ist zu betonen, dass die Zahl eine Potenz von zwei ist, und nicht eine völlig willkürliche Wahl. Es stupst somit Entwickler an, die mit verschiedenen Zahlen experimentieren, um sie zu anderen Zahlen in dem Muster zu ändern (z. B. 1 << 3 oder 1 << 5 statt 25), so dass sie den Code nicht brechen. Es gibt einen Kommentar just above:

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

Die Kapazität von jedem java.util.HashMap ist immer eine Zweierpotenz. Es ist so konzipiert, weil das die Verwendung einer schnellen bitweise UND-Verknüpfung ermöglicht es jedem Schlüssel des Hash-Code in den Bereich der Kapazität der Tabelle zu wickeln, wie Sie in methods that access the table sehen:

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

Ich würde hinzufügen, dass diese Art von Best Practice ist verwandt, um einen selbsterklärenden Code zu produzieren, und weiter zu vermeiden, die Verwendung von magischen Zahlen (http://stackoverflow.com/questions/47882/what-is-a-magic -Nummer-und-warum-ist-es-schlecht). Während hier eine ständige Verwendung mit einem entsprechenden Namen stattfindet, wird der Wert auch auf diese Weise mehr geklärt. – jotadepicas

8

ich nicht lesen kann Entwickler denken, aber wir machen solche Dinge, um eine Beziehung zwischen den Zahlen anzuzeigen.

Vergleichen Sie dies:

int day = 86400;

vs

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

Das zweite Beispiel zeigt deutlich die Beziehung zwischen den Zahlen und Java ist intelligent genug, dass als eine Konstante zu kompilieren.

0

Ich denke, der Grund ist, dass der Entwickler sehr einfach Änderung des Wert (nach JavaDoc ‚/ * Der Standardanfangskapazität -. Muss eine Potenz von zwei sein * /‘) zum Beispiel 1 << 5 oder 1 << 3 und er doesn brauche keine Berechnungen.

Verwandte Themen