2016-10-14 47 views
5

Dưới đây là mã nguồn của phương thức HashMap Java 7 (phương pháp) của Java 7. Như bạn có thể thấy, trong phương thức get, khi so sánh khóa, nó so sánh cả giá trị băm và khóa của khóa để xác định xem mục nhập trong danh sách liên kết có phải là khóa tìm kiếm hay không. Tuy nhiên, tôi giả sử rằng nếu hai khóa giống nhau, tất nhiên chúng sẽ có cùng mã băm và nếu hai khóa khác nhau, việc so sánh các giá trị của khóa là đủ để phân biệt chúng. Vậy tại sao mã nguồn Java HashMap quan tâm đến sự bình đẳng của mã băm của khóa?so sánh khóa hashmap, tại sao so sánh cả mã băm và khóa của khóa cả

public V get(Object key) { 
    if (key == null) 
     return getForNullKey(); 
    int hash = hash(key.hashCode()); 
    for (Entry<K,V> e = table[indexFor(hash, table.length)]; 
     e != null; 
     e = e.next) { 
     Object k; 
     if (e.hash == hash && ((k = e.key) == key || key.equals(k))) 
      return e.value; 
    } 
    return null; 
} 

Trả lời

8

Testing cho int bình đẳng với == là một hoạt động khá rẻ so với cách gọi equals trên một đối tượng phức tạp. Sự bình đẳng của băm là một phím tắt. Nếu phím không có ở tất cả, các hash sẽ không bằng nhau, và một tương đối nhanh chóng == mà trả về false sẽ tiết kiệm chạy một hoạt động tốn kém equals (nhờ logic ngắn mạch). Nếu chìa khóa ở đó, bạn đã "lãng phí" một sự bình đẳng nhanh chóng khác.

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