深入理解HashMap

HashMap是数组+链表+红黑树实现

Node是HashMap的内部类,实现了Map.Entery接口,主要就是存放我们put方法所添加的元素

其中的next就表示这可以构成一个单向链表,这主要是通过链地址法解决发生hash冲突问题

而当桶中的元素个数超过阈值的时候就换转为红黑树

HashMap是非线程安全的,应该用ConcurrentHashMap

 

 

 1.散列表后面跟的“链表、红黑树”是怎么来的,都解决了哪些问题?

    答:

    ①链表的由来:Hash碰撞:不同的元素通过hash算法可能会得到相同的hash值,如果都放同一个桶里,后面放进去的就会覆盖前面放的,所以为了解决hash碰撞时元素被覆盖的问题,就有了在桶里放链表。

    ②红黑树的由来:假设现在HashMap集合中大多数的元素都放到了同一个桶里(由hash值计算而得的桶的位置相同),那么这些元素就在这个桶后面连成了链表。现在需要查询某个元素,那么此时的查询效率就很慢了,它是在做链表查询( O(N) 的查询效率)。为了解决这个问题,就引入了红黑树( log(n) 的查询效率):当链表到达一定长度时就在链表的后面创建红黑树。

    ③其实,“尽量避免hash 冲突,让元素较为均匀的放置到每个桶”才是查询效率最高的( O1 的查询效率),这和hash算法的实现息息相关,这里不做深究。

2.如图可知,散列表后面跟的数据结构有可能是链表,也有可能是红黑树。散列表后面跟什么数据结构是怎么确定的?

    答:

    ①链表节点转换成红黑树节点的阈值, 节点数 >= 8 就转:

      static final int TREEIFY_THRESHOLD = 8;

    ②红黑树节点转换链表节点的阈值, 节点数 <= 6 就转:

      static final int UNTREEIFY_THRESHOLD = 6;

    ③转红黑树时, table的最小长度:

      static final int MIN_TREEIFY_CAPACITY = 64;

https://www.cnblogs.com/fsmly/p/11235484.html

https://www.cnblogs.com/laipimei/p/11275235.html

posted @ 2019-07-24 10:05  小蚊子大人KN  阅读(173)  评论(0编辑  收藏  举报