2016-03-16 15 views
7

Mã OpenJDK cho java.util.HashMap bao gồm các dòng sau:Tại sao nên sử dụng 1 << 4 thay vì 16?

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

Tại sao 1 << 4 sử dụng ở đây, và không 16? Tôi tò mò.

+6

Để hiển thị rõ ràng rằng đó là sức mạnh của hai, vì nhận xét ở trên nó trong 'HashMap.java' cho biết:'/* Dung lượng ban đầu mặc định - PHẢI là sức mạnh của hai. */' – khelwood

+0

Khi làm việc với các phép toán bit, nó có thể hữu ích. Nó làm cho nó rõ ràng hơn rằng biểu diễn nhị phân là '0b10000'. –

+2

Và không có cờ bit nào khác được đặt như thế? Đó là một cách rất dễ dàng để viết bit-flag, đặc biệt là khi bạn đi đến bit-số cao hơn Ví dụ, những gì bạn muốn viết, '1 << 31' hoặc' 2147483648'? –

Trả lời

17

Cần nhấn mạnh rằng số đó là sức mạnh của hai, và không phải là sự lựa chọn hoàn toàn tùy ý. Do đó, các nhà phát triển đã thử nghiệm các con số khác nhau để thay đổi số đó thành các số khác trong mẫu (ví dụ: 1 << 3 hoặc 1 << 5, thay vì 25) để chúng không phá vỡ mã. Có một bình luận just above:

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

Năng lực của bất kỳ java.util.HashMap luôn là một sức mạnh của hai. Nó được thiết kế theo cách đó bởi vì đó cho phép việc sử dụng các toán tử AND hoạt động nhanh để quấn mã băm của mỗi chìa khóa vào trong phạm vi năng lực của bảng, như bạn có thể nhìn thấy 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 
     ... 
+1

Tôi sẽ thêm rằng loại thực hành tốt nhất này có liên quan đến việc tạo ra mã tự giải thích hơn và tránh xa hơn nữa việc sử dụng số ma thuật (http://stackoverflow.com/questions/47882/what-is-a-magic -number-và-why-is-it-bad). Trong khi ở đây có một sử dụng liên tục với một tên thích hợp, giá trị cũng được nhiều hơn reveiling theo cách này. – jotadepicas

8

tôi không thể đọc được tâm trí của nhà phát triển, nhưng chúng tôi làm những việc như thế để chỉ ra mối quan hệ giữa các con số.

Hãy so sánh này:

int day = 86400;

vs

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

Ví dụ thứ hai đã cho thấy rõ mối quan hệ giữa các con số, và Java là đủ thông minh để biên dịch mà như một hằng số.

0

Tôi nghĩ lý do là nhà phát triển có thể dễ dàng thay đổi giá trị (theo JavaDoc '/ * Dung lượng ban đầu mặc định - PHẢI là công suất của hai. * /') Ví dụ: 1 << 5 hoặc 1 << 3 và anh ấy không 't cần phải làm bất kỳ tính toán.

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