HashMap在jdk1.8中是数组+链表+红黑树的数据结构,存储时,每一个数据单元都是Node结构,Node中包含key字段、value字段、next字段、hash字段

  1. HashMap是是懒加载机制,只有第一次put数据的时候才初始化长度16。

  2. 默认的加载因子是0.75,当达到16*0.75=12时,才会进行自动扩容

    扩容每次都是按照上一次tableSize位移运算得到的,就是左移 1 位运算

    1. 假设,tableSize = 16, 16 << 1 = 32
  3. Node中的hash字段是对key的hashCode()二次加工(高16位异或低16位)得到的

  4. hashMap的put方法流程:

    • 根据Node中的hash字段,计算所在的槽位(slot)下标
    • 当当前的位置没有元素时,便将方法传进来的key和value封装为一个node对象,放入这个位置
    • 如果当前位置不为空,并且当前位置里面的node节点还没有链化,比较该位置下的node对象的key与当前put对象的key是否完全相等;如果相等的话,直接替换value;如果不相等的话,采用尾插法在存在的node节点后面进行插入。
    • 如果当前位置不为空,并且当前位置里面的node节点已经链化,迭代查找node,看链表上元素的key,与当前传来的key是否完全一致,一致的话,replace。put之后,还需要检查当前链表的长度,有没有达到树化阈值8。若达到阈值,就调用一个树化方法,具体的树化操作都在这个树化方法里面完成。

源码:

  1. map.put(“2”,“ljs”);

    public V put(K key, V value) {return putVal(hash("2"), "2", "ljs", false, true);
    }
  2. hash(“2”)
    static final int hash(Object key) {   //代码省略了int h;//key.hashCode()该对象自己的hashcode//HashMap的哈希函数:(hashcode) ^ (hashcode >>> 16)//hashcode 与 向右无符号移动16位的自己 异或,一般都等于hashcode的值// >>> 与 >> 都是右移,>>> 是会把符号位也一起移动,就是说负数用 >>> 后,会成为正数return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
    }
  3. putVal(hash(“2”), “2”, “ljs”, false, true);

    这个方法里面是一些逻辑操作

HashMap的存储相关推荐

  1. 哈希存储 java_Java容器系列之HashMap的存储

    Java容器系列之HashMap 概要 本文将结合Java源码总结HashMap的存储结构及其扩容策略,并根据这些特点给出使用HashMap的最佳实践. 本文不再介绍HashMap的基本使用,有需要的 ...

  2. Java中如何给map数组制空,java.util.HashMap可以存储null键和null值。( )

    java.util.HashMap可以存储null键和null值.( ) 答:对 2008年网络新词新语大多与国家的社会生活息息相关,体现出网民高涨的参政议政热情和明显的舆论监督意识. 答:对 冯·诺 ...

  3. java源码系列:HashMap底层存储原理详解——4、技术本质-原理过程-算法-取模具体解决什么问题

    目录 简介 取模具体解决什么问题? 通过数组特性,推导ascii码计算出来的下标值,创建数组非常占用空间 取模,可保证下标,在HashMap默认创建下标之内 简介 上一篇文章,我们讲到 哈希算法.哈希 ...

  4. 【无标题】HashMap集合存储学生对象并遍历

    HashMap集合存储学生对象并遍历 需求:创建一个HashMap集合,键是学号(String),值是学生对象(Student),存储三个键值对元素,并遍历. 思路 定义一个学生类 创建HashMap ...

  5. 深入理解HashMap的存储以及计算过程,提高HashMap使用效率

    原文地址:http://www.iteye.com/topic/539465 /**      *@author annegu      *@date 2009-12-02      */ Hashm ...

  6. java源码系列:HashMap底层存储原理详解——5、技术本质-原理过程-算法-取模会带来一个什么问题?什么是哈希冲突?为什么要用链表?

    目录 取模会带来一个什么问题? 演示什么是哈希冲突(哈希碰撞)? 为什么要用链表? 其他--布隆过滤器 取模会带来一个什么问题? 好,那同学们这样他能达到一个目的,但是呢,它也会带来的一个问题,那它会 ...

  7. hashmap 存取原理图_HashMap的存储原理

    HashMap提供高效的查找,插入和删除.是怎么做到的? HashMap的存储结构 HashMap底层是以数组方式进行存储的.将key-value键值对作为数组的一个元素进行存储. Key-value ...

  8. HashMap/HashMap存储/HashMap扩容

    HashMap Java 集合,也称作容器,主要是由两大接口 (Interface)派生出来的:Collection 和 Map. Map集合体系: Map集合特点: (1) 键值对存储(key-va ...

  9. java中HashMap、ArrayList、HashSet的存储原理及遍历方式汇总

    HashMap类 底层存储方式:1. HashMap在JDK1.7之前底层是用数组+链表的方式存储的:在JDK1.8之后底层是用数组+链表+红黑树存储的;2.HashMap里面实现了一个静态内部类En ...

最新文章

  1. anconda安装后命令行中安装tensorflow报错
  2. Java常见问题汇总
  3. SLAM-ch2-使用kdevelop创建helloWorld程序
  4. hc05与单片机连接图_基于proteus的51单片机开发实例(13)-LED指示那个按键被按下
  5. .Net Core小技巧 - Hosted Services + Quartz实现定时任务调度
  6. 详解 Spotlight on MySQL监控MySQL服务器
  7. 【转】8G内存下MySQL的优化详细方案
  8. 乔布斯一生中的3次阴差阳错、柳暗花明
  9. 阿里云认证未来网络学院ACE公开课——30分钟掌握ACE考试通关攻略
  10. MapReduce算法(将数据按照 /OutputData/城市名称/日期(YYYY-MM-dd)/类型(固定Gn)/imsi.txt )
  11. 2017中国云计算评测报告 1
  12. rv1126 获取图像数据,实现图像裁剪、缩放、旋转【RK_MPI API接口】
  13. 使用Vuforia创建神奇宝贝GO风格增强现实游戏
  14. 强化学习经典model-free方法总结
  15. 数值积分-龙贝格(Romberg)积分
  16. HT合泰 单片机的仿真调试
  17. java实验指导书答案_(Java实验指导书答案2.doc
  18. ArcGIS水文分析实战教程(7)细说流域提取 1
  19. Verilog 1.0常用CD4000系列标准数字电路及其框图
  20. Ruby学习-安装、升级Ruby菜鸟教程(Linux环境下)

热门文章

  1. 深度Deep系统的使用问题记录
  2. Win11系统更新后网络速度变的很慢怎么办?
  3. ae教程 (六)人物滤镜 (二)清新粉色调
  4. 学习区块链的第一堂课--认识区块链
  5. 字体的基础知识:英文字体区分练习
  6. 【翻页电子书制作】云展网教程 | 设置个性化域名及与云展网无关的域名
  7. 微机原理-虚拟仿真实验-DAC0832数模电路汇编代码
  8. 浩方的服务器无响应,浩方平台教育网服务器人数突破两万
  9. 技嘉GIGABYTE AERO 15SA风扇噪音过大加油修理方法
  10. 内链锚文本布局技巧,原来是这样!