2013-06-24 27 views
10

Tôi vừa đọc về sự khác biệt giữa lớp HashMap và HashTable trong java. Ở đó tôi tìm thấy một sự khác biệt mà trước đây cho phép null phím và sau đó không đặc quyền cho cùng. Theo như làm việc của HashMap là mối quan tâm tôi biết rằng, nó gọi phương pháp hashcode trên chìa khóa để tìm kiếm trong đó cặp giá trị khóa được đặt. Dưới đây là câu hỏi của tôi: Làm thế nào hashcode cho một giá trị null được tính toán hoặc có bất kỳ giá trị mặc định cho hashcode của null key (nếu có xin vui lòng xác định giá trị)?Hashcode cho khóa NULL trong HashMap

Trả lời

14

từ HashMap:

public V put(K key, V value) { 
    if (key == null) 
     return putForNullKey(value); 
    ... 

và nếu bạn nhìn xa hơn, bạn sẽ thấy vô luôn đi vào bin 0

+0

Điều đó tôi nhận được từ mã lớp HashMap nhưng mã băm được tạo ra để đặt cặp giá trị khóa đó trong bin 0 có nghĩa là giá trị hashcode của bin 0. – Prashant

+0

có nghĩa là hashcode cho null là 0 hoặc (lý thuyết), bất kỳ số nào duy trì num & (tableSize-1) == 0 – radai

+0

Bạn có muốn nói rằng đối với khóa null, giá trị mặc định của hashcode là 0 và thùng/thùng đầu tiên sẽ được sử dụng để đặt nó theo Triển khai HashMap. – Prashant

3

Nếu bạn đọc mô tả về static int hash(int h) phương pháp trong HashMap bạn sẽ thấy rằng phím rỗng có chỉ số 0.

0

Khi giá trị rỗng tồn tại trong bản đồ, khóa của giá trị đó cũng là rỗng. bạn không thể có nhiều khóa null trong bản đồ. Chỉ có một phím null.

5

Từ mã nguồn của HashMap, nếu khóa là null, nó được xử lý khác nhau. Không có mã băm nào được tạo ra cho null, nhưng nó được lưu trữ duy nhất tại chỉ số 0 trong mảng nội bộ với giá trị băm 0. Cũng lưu ý rằng giá trị băm của một chuỗi rỗng cũng là 0 (trong trường hợp các khóa là chuỗi), nhưng chỉ mục ở đó được lưu trữ trong mảng nội bộ đảm bảo rằng chúng không được trộn lẫn.

/** 
* Offloaded version of put for null keys 
*/ 
private V putForNullKey(V value) { 
    for (Entry<K,V> e = table[0]; e != null; e = e.next) { 
     if (e.key == null) { 
      V oldValue = e.value; 
      e.value = value; 
      e.recordAccess(this); 
      return oldValue; 
     } 
    } 
    modCount++; 
    addEntry(0, null, value, 0); 
    return null; 
} 
0

Nó nêu rõ điều gì sẽ xảy ra khi bạn đặt một khóa có sẵn trên bản đồ. Trường hợp cụ thể của khóa == null hoạt động theo cùng một cách: bạn không thể có hai ánh xạ khác nhau cho khóa rỗng (giống như bạn không thể cho bất kỳ khóa nào khác). Nó không phải là một trường hợp đặc biệt, cho bối cảnh của câu hỏi của bạn.

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