zoukankan      html  css  js  c++  java
  • 哈希表

    哈希表是计算机存储数据的重要结构之一,其中在集合中HashSet和HashMap的底层存储结构都包含哈希表。

    哈希值

    又称哈希码值,是JDK根据地址或者属性值,算出来的int类型的整数

     Object类中有一个可以根据对象地址获得哈希值得方法。

    • public inthashCode();(这是根据地址值算出来的哈希值)
    • 如果没有重写hashCode方法,那么是根据对象的地址值计算出的hashCode()值;那么同一个对象多次调用hashCode方法返回的哈希值是相同的,不同对象的哈希值是不同的。
    • 如果重写了hashCode()方法,一般都是通过对象的属性值计算出哈希值,如果不同对象的属性值是一样的,那么计算出来的哈希值也是一样的。

    JDK中的哈希表:

    • JDK8之前,底层采用数组+链表实现
    • JDK8以后,底层进行了优化,由数组+链表+红黑树实现

    首先解释一下JDK1.8之前的版本:

    我们在创建HashSet集合的时候:

    • 会创建一个默认长度为16,默认加载因子为0.75的数组,数组名称叫做table
    • 根据元素的哈希值和数组的长度计算出元素应存入的位置
    • 判断当前位置是否为null,如果是null直接存入

    •  下一个添加的元素继续根据上面的方法计算出应该存入的位置,如果为null直接存入,如果不为null会调用equals();方法比较两者的属性值,如果属性值相同则不会存入,如果属性值不同则新元素存入数组中,老元素挂在新元素下面形成一个链表:

    •  当数组里面存了16*0.75=12个元素时,数组就会扩容为原来的两倍,以此类推。

    JDK1.8版本之后的哈希表:

    JDK1.8版本之后只在链表上做出了修改,当一个链表的长度大于8时会自动转换成一个红黑树:

      

    HashMap在哈希表中的存储

    • HashMap在哈希表中的存储是将整个entry对象看做是一个整体
    • 只计算键的哈希值
    • 如果计算的存储地址一样只调用键的equals();方法比较键的属性值。
    迎风少年
  • 相关阅读:
    同步linux服务器的时间
    Esper学习之四:Context
    Haproxy+Keepalived搭建Weblogic高可用负载均衡集群
    C++中的对象指针
    第十五周oj刷题——Problem M: C++习题 矩阵求和--重载运算符
    《人工智能教程(张仰森)》(二)
    JAVA 并发编程-线程池(七)
    新手学測试----Unit Test(单元測试)
    HDU2193-AVL-数据结构-AVL
    Visual Assist X破解版安装(vs2010助手)
  • 原文地址:https://www.cnblogs.com/ZYH-coder0927/p/13466028.html
Copyright © 2011-2022 走看看