2017-07-08 46 views
7

W klasach Collection Java, zauważyłem bardzo często kody jak poniżejJak działa tutaj i bitowy operator?

//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; 
} 

Co head = (h + 1) & (elements.length - 1); zrobić? Dlaczego używany jest operator & i jaki jest jego cel.

Moje pytanie nie brzmi, jak działa &, ale jakie jest jego zastosowanie.

Czy ktoś może to wyjaśnić?

Odpowiedz

11

Jest to skrót do (h + 1) % elements.length, który działa tylko wtedy, gdy elements.length jest potęgą dwóch. W przypadku niektórych starszych urządzeń może to działać nieco szybciej, chociaż wątpię, aby tak było w przypadku współczesnego procesora.

+0

Sprawdziłem, domyślna długość tablicy jest ustawiona na 16 i jest podwojona, gdy jest pełna. Dzięki – Roshan

1

Operacja & nie jest odpowiednikiem dla % odpowiednika dla. To nie jest w tym przypadku, ale są inne miejsca, gdzie ma to znaczenie (jak HashMap), gdzie odbywa się to poprzez:

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

Od hashcode s są int wartości - mogą być liczby ujemne. Użycie wartości % zamiast spowoduje uzyskanie liczby ujemnej, która po prostu nie może się zdarzyć dla HashMap (ponieważ jest to numer zasobnika).

+0

Dzięki za udział wiedzy !! – Roshan