zoukankan      html  css  js  c++  java
  • HashMap(摘)

    1.HashMap简介

    HashMap基于哈希表的Map接口实现,是以key-value存储形式存在。(除了不同步和允许使用 null 之外,HashMap 类与 Hashtable 大致相同。)
    HashMap 的实现不是同步的,这意味着它不是线程安全的。它的key、value都可以为null。此外,HashMap中的映射不是有序的。在 JDK1.8 中,HashMap 是由 数组+链表+红黑树构成,新增了红黑树作为底层数据结构,结构变得复杂了,但是效率也变的更高效。

    HashMap基于哈希思想,实现对数据的读写。当我们将键值对传递给put()方法时,它调用键对象的hashCode()方法来计算hashcode,然后找到bucket位置来存储值对象。当获取对象时,通过键对象的equals()方法找到正确的键值对,然后返回值对象。HashMap使用链表来解决碰撞问题,当发生碰撞时,对象将会储存在链表的下一个节点中。HashMap在每个链表节点中储存键值对对象。当两个不同的键对象的hashcode相同时,它们会储存在同一个bucket位置的链表中,可通过键对象的equals()方法来找到键值对。如果链表大小超过阈值(TREEIFY_THRESHOLD,8),链表就会被改造为树形结构。

    1.2 HashMap数据结构

    在 JDK1.8 中,HashMap 是由 数组+链表+红黑树构成,新增了红黑树作为底层数据结构,结构变得复杂了,但是效率也变的更高效。当一个值中要存储到Map的时候会根据Key的值来计算出他的

    hash,通过哈希来确认到数组的位置,如果发生哈希碰撞就以链表的形式存储 Object源码分析中解释过,但是这样如果链表过长来的话,HashMap会把这个链表转换成红黑树来存储。

    HashMap的存储结构

    2.类结构

    我们来看一下类结构

    在阅读源码的时候一直有个问题很困惑就是HashMap已经继承了AbstractMap而AbstractMap类实现了Map接口,那为什么HashMap还要在实现Map接口呢?同样在ArrayList中LinkedList中都是这种结构。

    据 java 集合框架的创始人Josh Bloch描述,这样的写法是一个失误。在java集合框架中,类似这样的写法很多,最开始写java集合框架的时候,他认为这样写,在某些地方可能是有价值的,直到他意识到错了。显然的,JDK的维护者,后来不认为这个小小的失误值得去修改,所以就这样存在下来了。

    • Cloneable 空接口,表示可以克隆

    • Serializable 序列化

    • AbstractMap 提供Map实现接口

    3.属性

    初始化容量(必须是二的n次幂)

    集合最大容量(必须是二的幂)

    负载因子,默认的0.75

    当链表的值超过8则会转红黑树(1.8新增)

    当链表的值小于6则会从红黑树转回链表

    当Map里面的数量超过这个值时,表中的桶才能进行树形化 ,否则桶内元素太多时会扩容,而不是树形化 为了避免进行扩容、树形化选择的冲突,这个值不能小于 4 * TREEIFY_THRESHOLD

    table用来初始化(必须是二的n次幂)

    用来存放缓存

    HashMap中存储的数量

    用来记录HashMap的修改次数

    用来调整大小下一个容量的值计算方式为(容量*负载因子)

    哈希表的加载因子

    重点属性

    • table在JDK1.8中我们了解到HashMap是由数组加链表加红黑树来组成的结构其中table就是HashMap中的数组

    • size为HashMap中K-V的实时数量

    • loadFactor加载因子,是用来衡量 HashMap 满的程度,计算HashMap的实时加载因子的方法为:size/capacity,而不是占用桶的数量去除以capacity。capacity 是桶的数量,也就是 table 的长度length。

    • threshold计算公式:capacity * loadFactor。这个值是当前已占用数组长度的最大值。过这个数目就重新resize(扩容),扩容后的 HashMap 容量是之前容量的两倍

    4.构造方法

    4.1 HashMap()

    构造一个空的 HashMap ,默认初始容量(16)和默认负载因子(0.75)。

    4.2 HashMap(int initialCapacity)

    构造一个空的 HashMap具有指定的初始容量和默认负载因子(0.75)。

    4.3 HashMap(int initialCapacity, float loadFactor)

    构造一个空的 HashMap具有指定的初始容量和负载因子。我们来分析一下。

    最后调用了tableSizeFor

     

  • 相关阅读:
    Java开发中的23种设计模式详解(转)
    主表和从表
    MyBatis开发中解决返回字段不全的问题
    个人常用配置文件解析
    SpringMVC+MyBatis开发中指定callSettersOnNulls,可解决返回字段不全的问题
    mybatis之sql执行有数据但返回结果为null
    Hadoop window win10 基础环境搭建(2.8.1)
    什么水平算精通C++ Builder?
    Delphi中取得汉字的首字母(十分巧妙)
    全部的Windows消息对应值
  • 原文地址:https://www.cnblogs.com/slfeng/p/11193858.html
Copyright © 2011-2022 走看看