• 深入理解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

  • 相关阅读:
    封装
    面向对象的思想
    Arrays工具类
    二分查找
    选择排序
    冒泡排序
    对象数组
    二维数组
    一维数组
    循环语句注意事项
  • 原文地址:https://www.cnblogs.com/ywsheng/p/11236152.html
Copyright © 2020-2023  润新知