hashmap中两个疑问
来源:10-4 HashMap
我心态好好哒
2019-08-09
1.如下图,第一次访问的时候hashmap是懒加载,put的时候会调用resize进行初始化。
table==null不会走下面红框的逻辑,那么为什么第一次put能够成功呢?没看到第一次有放入的操作。
2.如下图,get方法中会判断第一个节点是否树节点,这是合理的。但是调用keySet和entrySet里面的forEach却没有判断是否树化,只做了链表next遍历,这是正常的吗?
写回答
1回答
-
同学好,针对第一个问题,你其实可以直接新建个hashmap,然后往里面添加第一个元素,然后在
if ((p = tab[i = (n - 1) & hash]) == null) tab[i] = newNode(hash, key, value, null);
设置一个断点,就发现是能进入到里面去的,两个if是分开的,都会去判断并执行
针对第二个问题,是正常的,不管树或者链表,遍历的时候都是当做节点来处理的,具体一句两句说不清楚,同学可以在树化的hashmap里试试遍历调试一下就会清楚些,支持树节点的遍历是一个普适的需求,设计者是考虑在里面了的
00
相似问题