Nhìn vào triển khai, nó trông giống như cây nhị phân. Cụ thể hơn, bình luận dưới đây cho thấy nó là một cây đỏ-đen:
static final class TreeNode<K,V> extends LinkedHashMap.Entry<K,V> {
TreeNode<K,V> parent; // red-black tree links
TreeNode<K,V> left;
TreeNode<K,V> right;
TreeNode<K,V> prev; // needed to unlink next upon deletion
boolean red;
...
}
Đối với xử lý mã băm bình đẳng, điều này được giải quyết trong Javadoc:
thùng Tree (ví dụ, thùng mà yếu tố này là tất cả các TreeNode) là được sắp xếp chủ yếu bởi hashCode, nhưng trong trường hợp quan hệ, nếu hai phần tử giống nhau "class C implements Comparable<C>
", thì phương thức compareTo của chúng được sử dụng để đặt hàng.
Các TreeNode
s sử dụng trong HashMap
được cho là có cấu trúc tương tự như những người TreeMap
.
Bạn có thể thấy việc thực hiện việc tìm kiếm một TreeNode
chứa khóa cần ở đây:
/**
* Finds the node starting at root p with the given hash and key.
* The kc argument caches comparableClassFor(key) upon first use
* comparing keys.
*/
final TreeNode<K,V> find(int h, Object k, Class<?> kc) {
TreeNode<K,V> p = this;
do {
int ph, dir; K pk;
TreeNode<K,V> pl = p.left, pr = p.right, q;
if ((ph = p.hash) > h)
p = pl;
else if (ph < h)
p = pr;
else if ((pk = p.key) == k || (k != null && k.equals(pk)))
return p;
else if (pl == null)
p = pr;
else if (pr == null)
p = pl;
else if ((kc != null ||
(kc = comparableClassFor(k)) != null) &&
(dir = compareComparables(kc, k, pk)) != 0)
p = (dir < 0) ? pl : pr;
else if ((q = pr.find(h, k, kc)) != null)
return q;
else
p = pl;
} while (p != null);
return null;
}
Như bạn có thể thấy, đây là giống với nhị phân tìm kiếm cây tìm kiếm chuẩn. Đầu tiên, họ tìm kiếm TreeNode
có cùng số hashCode
làm khóa được tìm kiếm (vì một nhóm duy nhất của HashMap
có thể chứa các mục nhập có khác nhau hashCode
s). Sau đó, nó tiếp tục cho đến khi một số TreeNode
có khóa bằng phím được yêu cầu được tìm thấy. Tìm kiếm phụ sử dụng compareTo
nếu lớp của khóa thực hiện Comparable
. Nếu không, tìm kiếm đầy đủ hơn sẽ được thực hiện.
Lưu ý rằng bạn không nên dựa vào hành vi này. Đó là một dự phòng cụ thể trong trường hợp mã đã có hành vi bị hỏng (mã băm được nhóm). Và nếu các phím của bạn không băm tốt nhưng có thể so sánh được, bạn cũng có thể sử dụng sơ đồ trang web ngay từ đầu. – the8472