Я читаю исходный код LinkedHashMap в JDK 11 и обнаружил кусок мертвого кода (я не уверен)
Как мы все знаем, LinkedHashMap использует двусвязный список, чтобы сохранить порядок всех У него есть член с именем accessOrder
final boolean accessOrder;
По умолчанию он равен false, но если он установлен в true, каждый раз, когда вы запускаете get
, он перемещает элемент, который он получает, в конец связанного списка. Это то, что делает функция afterNodeAccess
.
//if accessOrder were set as true, after you visit node e, if e is not the end node of the linked list,
//it will move the node to the end of the linkedlist.
void afterNodeAccess(Node<K, V> e) {
LinkedHashMap.Entry<K, V> last;
if(accessOrder && (last = tail) != e) {
//if enter `if` ,it indicates that e is not the end of the linked list, because (last=tail!=e)
//then `a` as the after node of p(p is e after casting to LinkedHashMap.Entry) is never gonna be null. Only if p is last node of the linked list then a will be null.
LinkedHashMap.Entry<K, V> p = (LinkedHashMap.Entry<K, V>) e, b = p.before, a = p.after;
p.after = null;
if(b == null) {
head = a;
} else {
b.after = a;
}
// Is the if else clasue redundant? `a` must not be null.. the else clase will never be excuted.
if(a != null) {
a.before = b;
} else {
last = b;
}
if(last == null) {
head = p;
} else {
p.before = last;
last.after = p;
}
tail = p;
++modCount;
}
}
Итак, вот моя проблема:
(accessOrder && (last = tail) != e
означает, что e не является последним узлом связанного список. Если e уже является последним узлом, нам не нужно ничего делать, правильно?
Тогда a
в качестве узла после p (p является e после преобразования в LinkedHashMap.Entry), он не может быть нулевым. Только если p
- последний узел, тогда a
может быть нулевым.
Так в чем же смысл следующего фрагмента кода?
// Is the if else clasue redundant? `a` must not be null.. the else clase will never be excuted.
if(a != null) {
a.before = b;
} else {
last = b;
}
a
всегда != null
, предложение else last = b
никогда не будет выполнено .... это мертвый код?
Также я провожу эксперимент с accessorder
, установленным как true
, затем я get
последний узел в режиме отладки, и кажется, что я не могу никогда не попасть в вышеуказанное caluse last = b
Есть предложения?