final V remove(Object key, int hash, Object value) {//value===null
if (!tryLock())
scanAndLock(key, hash);
V oldValue = null;
try {
HashEntry<K,V>[] tab = table;//段数据
int index = (tab.length - 1) & hash;
HashEntry<K,V> e = entryAt(tab, index);//确定链表头部的位置
HashEntry<K,V> pred = null;
while (e != null) {//遍历
K k;
HashEntry<K,V> next = e.next;
if ((k = e.key) == key ||
(e.hash == hash && key.equals(k))) {//找着key
V v = e.value;
if (value == null || value == v || value.equals(v)) {//确定value
if (pred == null)
setEntryAt(tab, index, next);//如果是第一个元素,则直接把第二个元素放在第一个首位
else
pred.setNext(next);//如果不是第一个entry,则将上一个pred的next属性指向下一个entry,忽略了当前节点
++modCount;
--count;
oldValue = v;
}
break;
}
pred = e;
e = next;
}
} finally {
unlock();
}
return oldValue;
}
,而且速度比N最短路分词器快几倍,请酌情选择。