请大佬帮我详细解释一下hashmap这个语句啥意思

IMG_20200225_233747.jpg
小白求问。这个画黄色的线上面这个语句什么意思。很多符号理解不了。还有在哪里短句做判断也不懂。谢谢!

回答:

摘自本人文章一文详解HashMap

    final V putVal(int hash, K key, V value, boolean onlyIfAbsent,

boolean evict) {

Node<K,V>[] tab; Node<K,V> p; int n, i;

// 当数组为空或长度为0,初始化数组容量(resize() 方法是初始化或者扩容用的)

if ((tab = table) == null || (n = tab.length) == 0)

n = (tab = resize()).length;

// 计算数组下标 i = (n-1) & hash

// 如果这个位置没有元素,则直接创建Node并存值

if ((p = tab[i = (n - 1) & hash]) == null)

tab[i] = newNode(hash, key, value, null);

else {

// 这个位置已有元素

Node<K,V> e; K k;

if (p.hash == hash &&

((k = p.key) == key || (key != null && key.equals(k))))

// hash值、key值相等,用e变量获取到当前位置这个元素的引用,后面用于替换已有的值

e = p;

else if (p instanceof TreeNode)

// 当前是以红黑树方式存储,执行其特有的putVal方法 -- putTreeVal

e = ((TreeNode<K,V>)p).putTreeVal(this, tab, hash, key, value);

else {

// 当前是以链表方式存储,开始遍历链表

for (int binCount = 0; ; ++binCount) {

if ((e = p.next) == null) {

// 这里是插入到链表尾部!

p.next = newNode(hash, key, value, null);

if (binCount >= TREEIFY_THRESHOLD - 1) // -1 for 1st

// 超过阈值,存储方式转化成红黑树

treeifyBin(tab, hash);

break;

}

if (e.hash == hash &&

((k = e.key) == key || (key != null && key.equals(k))))

break;

p = e;

}

}

if (e != null) { // existing mapping for key

V oldValue = e.value;

if (!onlyIfAbsent || oldValue == null)

// onlyIfAbsent 如果为true - 不覆盖已存在的值

// 把新值赋值进去

e.value = value;

afterNodeAccess(e);

return oldValue;

}

}

// 记录修改次数

++modCount;

// 判断元素数量是否超过阈值 超过则扩容

if (++size > threshold)

resize();

afterNodeInsertion(evict);

return null;

}

回答:

(k = p.key) == key || (key != null && key.equals(k))

相当于2个boolean进行或运算。即 A || B

其中 A = ((k = p.key) == key) 这句话的意思就是先将p.key赋值给k,然后判断k是否等于key。如果等于则A为true,否则为false; 该句话等同于下面的代码

K k = p.key; // 将p.key赋值给key

if (k == key) {

A = true;

} else {

A = false;

}

其中B= (key != null && key.equals(k)),这句话就比较好理解了吧。key不为null,并且keyk相等时,B为true;否则为false

以上是 请大佬帮我详细解释一下hashmap这个语句啥意思 的全部内容, 来源链接: utcz.com/p/178945.html

回到顶部