2013-04-02 27 views
12
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; 
} 

Những gì tôi biết là, nếu bạn muốn có được một đối tượng từ HashMap, trước hết nó tìm kiếm xô băm dựa trên hashcode giá trị/băm và sau đó duyệt qua LinkedList trong hashbucket đó (giả sử các đối tượng diff có cùng mã băm, do đó trong cùng một nhóm băm).HashMap sử dụng LinkedList nội

Nhưng sau khi nhìn vào mã ở trên, tôi không thể hiểu được khi nó lặp qua LinekedList (và ở đâu là LinkedList)

Trả lời

21

Các xô danh sách liên kết, hiệu quả. Mảng table là mảng gồm các phần tử Entry và mỗi Entry là danh sách được liên kết, trong đó mỗi mục đều biết về danh sách tiếp theo trong danh sách, cho đến khi bạn đạt đến kết thúc khi tham chiếu next là không. Vòng lặp for bạn đã hiển thị lặp qua danh sách được liên kết.

Nó không phải là LinkedList như trong một java.util.LinkedList - đó là một triển khai riêng biệt (đơn giản) chỉ dành cho bản đồ.

3

Danh sách này sử dụng danh sách được liên kết chứ không sử dụng lớp java.util.LinkedList.

Về cơ bản e.next là thứ bạn đang tìm kiếm. Mỗi mục nhập có tham chiếu đến mục nhập tiếp theo trong nhóm - đó là triển khai danh sách được liên kết.

2

e.next là những gì bạn đang tìm kiếm. Mỗi mục có một tham chiếu đến mục nhập tiếp theo trong nhóm; đó là triển khai danh sách được liên kết.

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