Відповідно до наступного документа з посиланнями: Впровадження Java HashMap
Мене плутає реалізація HashMap
(вірніше, вдосконалення в HashMap
). Мої запити:
По-перше
static final int TREEIFY_THRESHOLD = 8;
static final int UNTREEIFY_THRESHOLD = 6;
static final int MIN_TREEIFY_CAPACITY = 64;
Чому і як використовуються ці константи? Я хочу кілька наочних прикладів для цього. Як вони цим досягають підвищення продуктивності?
По-друге
Якщо ви бачите вихідний код HashMap
в JDK, ви знайдете такий статичний внутрішній клас:
static final class TreeNode<K, V> extends java.util.LinkedHashMap.Entry<K, V> {
HashMap.TreeNode<K, V> parent;
HashMap.TreeNode<K, V> left;
HashMap.TreeNode<K, V> right;
HashMap.TreeNode<K, V> prev;
boolean red;
TreeNode(int arg0, K arg1, V arg2, HashMap.Node<K, V> arg3) {
super(arg0, arg1, arg2, arg3);
}
final HashMap.TreeNode<K, V> root() {
HashMap.TreeNode arg0 = this;
while (true) {
HashMap.TreeNode arg1 = arg0.parent;
if (arg0.parent == null) {
return arg0;
}
arg0 = arg1;
}
}
//...
}
Як він використовується? Я просто хочу пояснити алгоритм .
String
, мають набагато більший простір значень, ніжint
хеш-код, отже, зіткнень не уникнути. Тепер це залежить від фактичних значень, таких як фактичніString
s, які ви вводите на карту, чи отримаєте ви рівномірний розподіл чи ні. Поганий розподіл може бути наслідком просто нещастя.