HashMap面经补充

基础

1 Java 8系列之重新认识HashMap
2 面试 ConcurrentHashMap ,看这一篇就够了!

HashMap

HashMap链表转化为红黑树的时机,为什么是这个时机

两个条件
1 链表长度大于等于8
2 MIN_TREEIFY_CAPACITY参数即底层数组的大小大于等于64的时候(不是总的数据项(键值对)的数量。)

为什么达到8就需要变成树?降到6又变回链表?

事实上,链表长度超过 8 就转为红黑树的设计,更多的是为了防止用户自己实现了不好的哈希算法时导致链表过长,从而导致查询效率低, 而此时转为红黑树更多的是一种保底策略,用来保证极端情况下查询的效率。

通常如果 hash 算法正常的话,那么链表的长度也不会很长,那么红黑树也不会带来明显的查询时间上的优势,反而会增加空间负担。所以通常情况下,并没有必要转为红黑树,所以就选择了概率非常小,小于千万分之一概率,也就是长度为 8 的概率,把长度 8 作为转化的默认阈值

为什么还需要满足底层数组的大小大于等于64的条件?

在这个上下文中,MIN_TREEIFY_CAPACITY(默认值64)是指HashMap的容量,也就是说,是底层数组的大小,而不是总的数据项(键值对)的数量。

当HashMap的底层数组的容量达到MIN_TREEIFY_CAPACITY,并且某个索引下链表的长度达到阈值(默认为8),此时才会将这个链表转换为红黑树。

之所以要求底层数组的容量达到MIN_TREEIFY_CAPACITY,是因为在数组容量扩充之后,原本在同一个索引下产生冲突的元素有可能会被分配到不同的索引下,从而减少链表的长度。所以,当数组容量还比较小的时候,首选的优化策略是扩充数组的容量,而不是将链表转换为红黑树。只有当数组容量已经达到一定大小,但链表长度仍然过长的时候,才需要将链表转换为红黑树,以提高查找效率

ConcurrentHashMap

ConcurrentHashMap 迭代器是强一致性还是弱一致性?读取数据时,会产生不一致的问题吧,如果某一个操作需要在迭代器迭代ConcurrentHashMap保证强一致性,即要求总是读取最新数据怎么办?

猜你喜欢

转载自blog.csdn.net/yxg520s/article/details/132042064