2017-07-08 4 views
7

In Java-Sammlung Klassen, ich habe wieWie funktioniert & Bit-Operator hier?

//ArrayDeque 
    public E pollFirst() { 
    int h = head; 
    @SuppressWarnings("unchecked") 
    E result = (E) elements[h]; 
    // Element is null if deque empty 
    if (result == null) 
     return null; 
    elements[h] = null;  // Must null out slot 
    head = (h + 1) & (elements.length - 1); 
    return result; 
} 

Was head = (h + 1) & (elements.length - 1); zu tun hat unter sehr oft Codes bemerkt? Warum wird & Operator hier verwendet und welchen Zweck dient es.

Meine Frage ist nicht, wie & funktioniert, aber was nutzt es hier.

Kann jemand es erklären?

Antwort

11

Es ist eine Abkürzung für (h + 1) % elements.length, die nur funktioniert, wenn elements.length eine Potenz von zwei ist. Auf etwas älterer Hardware mag das etwas schneller gelaufen sein, obwohl ich bezweifle, dass dies bei einer modernen CPU immer noch der Fall ist.

+0

Ich überprüft, Standard-Array-Länge ist auf 16 eingestellt und verdoppelt, wenn voll. Danke – Roshan

1

Das & Betrieb ist kein wahr gleichwertig für %, denke negative Zahlen. Es ist hier nicht der Fall, aber es gibt andere Orte, an denen diese Angelegenheiten (wie HashMap), wobei dies über getan wird:

(n - 1) & hash // n - current capacity, hash - hashcode 

Da hashcode s sind int Werte - sie können negative Zahlen sein. Die Verwendung von % anstelle von & würde zu einer negativen Zahl führen, was bei HashMap einfach nicht passieren kann (da dies die Bucket-Nummer ist).

+0

Danke für den Wissensaustausch !! – Roshan

Verwandte Themen