关于hashmap在什么时候使用数组,什么时候使用链表/红黑树的问题

问题:

1.java8以后链表长度超过8会转为红黑树,当删除后长度效益8会转为链表。这个我知道,但是hashmap是使用Node[] table来存储node,那么问题就来了,什么情况下元素存储在table中,什么情况下转为链表存储。是不是发生了hash碰撞才会转为链表存储,但是一个hashmap发生hash碰撞的概率小之又小,这样利用率太低了,发生红黑树的转换我感觉几乎不可能存在(应为转为红黑树的前提是发生8次hash碰撞,除非恶意改写hashcode生成函数),那如果没有发生hash冲突,是不是都存储在数组中的?

2.当发生hash碰撞时,元素存储在链表中,通过key  get出来的value按理说会有多个啊,怎么取得出来。

3.hashmap的检索速度是o(1),怎么通过hashcode迅速定位到该node的

可以只回答其中一个问题,我主要是想弄明白第一个问题!

第一个问题自己看源码吧,很久没看过我也忘了。通过 key 找到 value,算出 hashCode 只是第一步,也就是说要找到对应的 value 是需要多次判断的,如果通过 hashcode 找到 value 的时候,还会去直接比较 key 是否相等。一切的一切都是最好自己去看源码,根据你的疑惑点,找到对应的位置看,其实没有那么难,又不是看所有的。