关于HashMap源码

Salted-fish 2021-04-09 01:09:00
final V putVal(int hash, K key, V value, boolean onlyIfAbsent,
boolean evict) {
Node<K,V>[] tab; Node<K,V> p; int n, i;
if ((tab = table) == null || (n = tab.length) == 0)
n = (tab = resize()).length;
if ((p = tab[i = (n - 1) & hash]) == null)
tab[i] = newNode(hash, key, value, null);


HashMap的putVal 方法,为什么还要单独新建个局部变量Node<K,V>[] tab ,tab = table.直接操作table不行吗
...全文
140 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
KeepSayingNo 2021-04-10
  • 打赏
  • 举报
回复
这个else里面的代码表示的是新增的数据其key和value都和HashMap里面某个数据相等的情况,这个就直接用e指向p即可,不需要新创建节点了
Salted-fish 2021-04-09
  • 打赏
  • 举报
回复
table是成员变量,tab=table,resize()方法返回的新的Node<K,V>[]也只是改变后的成员变量table. 引用的地址都是一样的. Node<K,V>[] tab; Node<K,V> p; int n, i; if ((tab = table) == null || (n = tab.length) == 0) n = (tab = resize()).length; 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)))) e = p; 就有点像是 e和p的问题, e和p只是不同的对象,e是p的浅拷贝,引用的地址是不变的.e改变,p也会跟着改变.为什么还要再新建个e.直接操作p不行了.绕的人头晕.
KeepSayingNo 2021-04-09
  • 打赏
  • 举报
回复
是发生了扩容就需要新建一个吧

51,395

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧