#transfer()# 关于HashMap扩容时,将旧数据转移到新数组的transfer()方法的疑惑,求大佬指示。

北北啊我是 2021-05-06 05:03:12


如图,table是被遍历的entry数组,e是每一个entry键值对,而e.next也是一个键值对对象(e的一个属性),那么问题来了,第二个绿框中idea的提示,是代表next是一个entry数组吗?next不应该是一个entry对象吗?还是我理解错了,HashMap$Entry[4]这种写法就是代表数组的一个元素(对象)?那跟上边newTable后边的写法又矛盾了啊。
我晕了,求大佬指点。

还有个问题 下图 明明 i=4,应该插入到索引4处 ,为啥赋值以后 newTable却显示插入到了索引7处呢... 我又晕了.. 请大佬明示... 谢谢
...全文
1023 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
引用 10 楼 北北啊我是 的回复:
[quote=引用 9 楼 狂奔的蜗牛已被占用 的回复:][quote=引用 3 楼 北北啊我是 的回复:][quote=引用 2 楼 七国的天下,我要九十九 的回复:]for循环你还是没搞懂, e 表示 就是一个Entry<K,V>对象 比如 for(User user : UserList) 这种结构.
谢谢你回复啊 不过你好像没懂我问的意思 我当然知道e是一个对象 我问的是next变量 他也是一个对象 但是后边写的类型却是数组(第二个绿框里)[/quote] 你说的是next(slot_4):HashMap$Entry[4]@521吧,和上面的newtable【newtable:HashMap$Entry[8]@525】写法还是不一样的,少了一个slot_4;你要想知道next表示什么直接看Entry的源码,里面就很明确的定义了next,就是一个Entry对象,而不是数组; 第二个问题:你下面的7,表示的是数组的最大下标(size=8,最大下标是7);[/quote] 不是吧大兄弟 你俩问题我觉得说的都不对... slot是表示存储位置的局部变量槽, 跟next是啥对象应该没关系; 下边数组那个你自己debug一遍, 那个7并不是代表最大下标, 就是哪个索引上存了值, 不是最大下标 你走一遍debug就知道了[/quote] 感谢大兄弟指正。这部分确实没看懂,又百度了一波slot大有收获。。我用的是jdk1.8,加上idea的版本不同,没有复现你的问题,期待大佬解释。
北北啊我是 2021-05-19
  • 打赏
  • 举报
回复
引用 9 楼 狂奔的蜗牛已被占用 的回复:
[quote=引用 3 楼 北北啊我是 的回复:][quote=引用 2 楼 七国的天下,我要九十九 的回复:]for循环你还是没搞懂, e 表示 就是一个Entry<K,V>对象 比如 for(User user : UserList) 这种结构.
谢谢你回复啊 不过你好像没懂我问的意思 我当然知道e是一个对象 我问的是next变量 他也是一个对象 但是后边写的类型却是数组(第二个绿框里)[/quote] 你说的是next(slot_4):HashMap$Entry[4]@521吧,和上面的newtable【newtable:HashMap$Entry[8]@525】写法还是不一样的,少了一个slot_4;你要想知道next表示什么直接看Entry的源码,里面就很明确的定义了next,就是一个Entry对象,而不是数组; 第二个问题:你下面的7,表示的是数组的最大下标(size=8,最大下标是7);[/quote] 不是吧大兄弟 你俩问题我觉得说的都不对... slot是表示存储位置的局部变量槽, 跟next是啥对象应该没关系; 下边数组那个你自己debug一遍, 那个7并不是代表最大下标, 就是哪个索引上存了值, 不是最大下标 你走一遍debug就知道了
北北啊我是 2021-05-18
  • 打赏
  • 举报
回复
自己再捞一下 求大佬
  • 打赏
  • 举报
回复
引用 3 楼 北北啊我是 的回复:
[quote=引用 2 楼 七国的天下,我要九十九 的回复:]for循环你还是没搞懂, e 表示 就是一个Entry<K,V>对象 比如 for(User user : UserList) 这种结构.
谢谢你回复啊 不过你好像没懂我问的意思 我当然知道e是一个对象 我问的是next变量 他也是一个对象 但是后边写的类型却是数组(第二个绿框里)[/quote] 你说的是next(slot_4):HashMap$Entry[4]@521吧,和上面的newtable【newtable:HashMap$Entry[8]@525】写法还是不一样的,少了一个slot_4;你要想知道next表示什么直接看Entry的源码,里面就很明确的定义了next,就是一个Entry对象,而不是数组; 第二个问题:你下面的7,表示的是数组的最大下标(size=8,最大下标是7);
北北啊我是 2021-05-08
  • 打赏
  • 举报
回复
引用 5 楼 KeepSayingNo 的回复:
第一个问题:e.next是一个entry对象 第二个问题:扩容后,数组为原来的2倍,rehash后计算出来的桶的位置变了,不再是4
谢谢您回复 看见您回复的第二个问题 我第一反应以为是这样的 但是仔细一想 好像不对 这个截图是debug时候截的 这一循环没结束呢 自然不涉及到循环外的resize() 所以索引应该是不变的才对啊
北北啊我是 2021-05-08
  • 打赏
  • 举报
回复
引用 2 楼 七国的天下,我要九十九 的回复:
for循环你还是没搞懂, e 表示 就是一个Entry<K,V>对象 比如 for(User user : UserList) 这种结构.
。。。next是一个对象 但是你往后看全啊 第二绿框后半部分 显示是一个内部类Entry数组 你懂我意思吗
KeepSayingNo 2021-05-08
  • 打赏
  • 举报
回复
第一个问题:e.next是一个entry对象 第二个问题:扩容后,数组为原来的2倍,rehash后计算出来的桶的位置变了,不再是4
韩_师兄 2021-05-08
  • 打赏
  • 举报
回复
引用 3 楼 北北啊我是 的回复:
[quote=引用 2 楼 七国的天下,我要九十九 的回复:]for循环你还是没搞懂, e 表示 就是一个Entry<K,V>对象 比如 for(User user : UserList) 这种结构.
谢谢你回复啊 不过你好像没懂我问的意思 我当然知道e是一个对象 我问的是next变量 他也是一个对象 但是后边写的类型却是数组(第二个绿框里)[/quote] 第二个绿色框 Entry<K,V> next = e.next; 这个next是Entry对象啊,没有问题啊?
北北啊我是 2021-05-08
  • 打赏
  • 举报
回复
引用 2 楼 七国的天下,我要九十九 的回复:
for循环你还是没搞懂, e 表示 就是一个Entry<K,V>对象 比如 for(User user : UserList) 这种结构.
谢谢你回复啊 不过你好像没懂我问的意思 我当然知道e是一个对象 我问的是next变量 他也是一个对象 但是后边写的类型却是数组(第二个绿框里)
韩_师兄 2021-05-08
  • 打赏
  • 举报
回复
for循环你还是没搞懂, e 表示 就是一个Entry<K,V>对象 比如 for(User user : UserList) 这种结构.
北北啊我是 2021-05-08
  • 打赏
  • 举报
回复
up一下 求高人

67,512

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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