zoukankan      html  css  js  c++  java
  • HashMap(1.8)理解

    先放一个流程图了解一下HashMap的put()操作:

    1.HashMap底层采用数组、链表、红黑树来实现。

    2.表的长度一定是2^n(便于快速计算hash值和扩展),若初始化时指定容量不满足,则HashMap会自动将容量变为2^n。

    3..计算hash值的方法:基于key的hashcode,将低16位与高16位进行异或运算。然后与(length-1)做&运算,得到index值。(null的hashCode为0,所以HashMap所允许的唯一null键,存放在table[0]中)

    4.HashMap内没有直接的capacity变量,可通过table.length获得。初始时指定的capacity会先赋值给threshold,然后再乘以负载因子(默认0.75)得到新的threshold。

    5.HashMap在第一次put()操作的时候开辟table[]数组,而不是在new HashMap的时候,默认大小为16。

    6.当size超过threshold时会自动进行扩容,将length和threshold都翻倍。

    7.当HashMap扩容后,将oldTable中的元素迁移到newTable中,分为以下几种情况:

      1)oldTable[i]中只有一个元素:直接放入newTable的指定位置(newTab[e.hash & (newCap - 1)] = e;)。

      2)oldTable[i]是一个红黑树节点:左子树继续保留在newTable[i]的位置上,右子树放在newTable[i+oldCapacity]位置上。若钱以后树的长度小于6,则转化为链表。

      3)oldTable[i]是一个链表:通过条件((e.hash & oldCap) == 0)将链表分为两半,一部分保留在newTable[i]的位置上,另一部分放在newTable[i+oldCapacity]位置上。

    8.桶中是链表,添加新节点,如果达到了TREEIFY_THRESHOLD,需要检查是否要转换为红黑树结构,treeifyBin()会检查桶数组的大小是否超过MIN_TREEIFY_CAPACITY(64),不超过只是进行resize扩展,否则才转换树。

    9.get()操作时,会先比较key的hash值,后将map中的key和要查询的key做equals(),若相同,则取出该key所对应的value。hash和key本质上是key的hashCode和equals方法的应用,hashCode不相等,equals必然不相等,hashCode相等再检查equals是否相等。

    10.红黑树是搜索树,因此需要节点是有序的,但是HashMap的类型参数没有Comparable的限定,因此当key对象类型未实现Comparable接口,将使用这个对象的原始hashCode(即Object的hashCode,无论有没有覆盖hashCode方法,null的hashCode为0)。 

     
     
  • 相关阅读:
    Centos 7 安装jdk 配置环境变量
    【转载】C#检测客户端输入的内容是否含有危险字符串
    【转载】C#将图片以二进制流的方式存入数据库
    【转载】为何你的网站一直不被百度、搜狗、谷歌等搜索引擎收录
    【转载】目前国内主流的云服务器厂商有哪些
    【转载】阿里云服务器为网站选配Https证书
    【转载】网站遭遇DDoS攻击怎么办
    使用的阿里云服务器被黑客入侵怎么办
    HTTP状态码以及其含义大全
    Url的Base64编码以及解码
  • 原文地址:https://www.cnblogs.com/tenghaoxiang/p/10635039.html
Copyright © 2011-2022 走看看