2017-07-08 13 views
7

Trong lớp Collection Java, tôi đã nhận thấy rất thường xuyên mã như dưới đâyLàm cách nào và toán tử bit hoạt động ở đây?

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

không head = (h + 1) & (elements.length - 1); làm gì? Tại sao là & nhà điều hành được sử dụng tại đây và mục đích của nó là gì.

Câu hỏi của tôi không phải là cách hoạt động của &, nhưng việc sử dụng nó ở đây là gì.

Có ai giải thích được không?

Trả lời

11

Đó là lối tắt cho (h + 1) % elements.length chỉ hoạt động nếu elements.length là công suất của hai. Trên một số phần cứng cũ hơn, điều này có thể chạy nhanh hơn một chút, mặc dù tôi nghi ngờ đây vẫn là trường hợp trên một CPU hiện đại.

+0

Tôi đã chọn, độ dài mảng mặc định được đặt thành 16 và được tăng gấp đôi khi đầy. Cảm ơn – Roshan

1

Hoạt động & không phải là đúng tương đương với %, suy nghĩ số âm. Đây không phải là trường hợp ở đây, nhưng có những nơi khác, nơi mà vấn đề này (như HashMap), nơi này được thực hiện thông qua:

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

Kể từ hashcode s là int giá trị - họ có thể số âm. Sử dụng % thay vì & sẽ dẫn đến một số âm, điều đơn giản là không thể xảy ra cho HashMap (vì đó là số nhóm).

+0

Cảm ơn bạn đã chia sẻ kiến ​​thức !! – Roshan

Các vấn đề liên quan