HashMap结构

JDK1.7及之前:数组+链表
JDK1.8:数组+链表+红黑树

数组+链表

当数据通过put()方法插入时
会通过hash散列算法计算得出固定长度的数组下标——>

int hash = hash(key);

如果该数组下标对应的数据是null,则直接插入。如果有数值——>
1.7:头插法,通过改变头部节点的上节点指向
1.8:尾插法,通过改变尾部节点的下节点指向
由于HashMap属于线程不安全结构,那么如果多线程插入时扩容产生元素迁移则会导致原来a->b的指向,而迁移时重新计算索引位置有可能会导致b->a的情况产生,就变成了a->b->a…循环链。
原因:

e.next = newTable[i];

而1.8使用尾插法则在插入时直接插入到尾部,而HashMap扩容时是先赋值后扩容的方式,尾插时则不会导致循环链产生

插入时会通过hash散列先将key进行计算判断是否在数组中存在,如果
存在则通过key和value进行再次散列判断;
如果该数组不存在hash碰撞,则判断该数组下是否是null;
如果是,则newNode追加节点插入链表;
如果不是,则判断是否是红黑树;
如果不是,则判断长度是否不小于8;
如果小于8则追加节点,如果不小于8,则触发扩容

当数据通过get()方法查询时
同样会通过hash散列算法获取数组下标,然后通过数组下标查询到对应的数组,如果该数组下有一链表,那么通过key进行遍历判断获取对应的数据。
通过key计算hash值
判断HashMap的数组是否为null和数组长度是否为0,如果为null和0则直接返回null
如果不为null和0,计算key的下标,判断第一个node是否是对应数据,如果是,则直接返回数据
如果不满足条件,判断是否是最后一个节点node,如果是,则返回null
如果不是最后一个node,判断是否是红黑树,如果是红黑树,则通过hash值判断进入红黑树获取key
如果不是红黑树,遍历链表判断是否有满足的条件,有则直接返回,无则返回null

HashMap的get/put相关推荐

  1. 在js中使用HashMap数据结构,在js中使用K,V数据结构

    首先是定义一个HashMap方法,做基类(复制在js中即可,然后引用) //简单的哈希表,begin function HashMap() {/** Map 大小 * */var size = 0;/ ...

  2. Map再整理,从底层源码探究HashMap

    前言 本文为对Map集合的再一次整理.内容包括:Map HashMap LinkedHashMap TreeHashMap HashTable ConcurrentHashMap Map Map< ...

  3. HashMap 的长度为什么是 2 的幂次方?

    HashMap 的长度为什么是 2 的幂次方? 为了能让HashMap存取高效,尽量减少碰撞,需要将散列表的数据分配均匀.使用HashMap查询或插入数据时,需要先对数组长度取模运算,index = ...

  4. 解决Apache CXF 不支持传递java.sql.Timestamp和java.util.HashMap类型问题

    在项目中使用Apache开源的Services Framework CXF来发布WebService,CXF能够很简洁与Spring Framework 集成在一起,在发布WebService的过程中 ...

  5. hashmap value可以为空吗_美团面试题:Hashmap结构,1.7和1.8有哪些区别(最详细解析)...

    作者|依本多情 原文:blog.csdn.net/qq_36520235/article/details/82417949 一.真实面试题之:Hashmap的结构,1.7和1.8有哪些区别 不同点: ...

  6. hashmap实现原理_Java中HashMap底层实现原理(JDK1.8)源码分析

    在JDK1.6,JDK1.7中,HashMap采用位桶+链表实现,即使用链表处理冲突,同一hash值的链表都存储在一个链表里.但是当位于一个桶中的元素较多,即hash值相等的元素较多时,通过key值依 ...

  7. android 设置setmultichoiceitems设置初始化勾选_阿里巴巴Java开发手册建议创建HashMap时设置初始化容量,但是多少合适呢?...

    集合是Java开发日常开发中经常会使用到的,而作为一种典型的K-V结构的数据结构,HashMap对于Java开发者一定不陌生. 关于HashMap,很多人都对他有一些基本的了解,比如他和hashtab ...

  8. HashMap 和 Hashtable 的 6 个区别,最后一个没几个人知道!

    HashMap 和 Hashtable 是 Java 开发程序员必须要掌握的,也是在各种 Java 面试场合中必须会问到的. 但你对这两者的区别了解有多少呢? 现在,栈长我给大家总结一下,或许有你不明 ...

  9. transient HashMap使用目的分析

    看HashSet源码有这么一句: private transient HashMap<E,Object> map; 再看HashSet的Add方法: 实际上HashSet是复用HashMa ...

  10. 调试JDK源码-一步一步看HashMap怎么Hash和扩容

    调试JDK源码-一步一步看HashMap怎么Hash和扩容 调试JDK源码-ConcurrentHashMap实现原理 调试JDK源码-HashSet实现原理 调试JDK源码-调试JDK源码-Hash ...

最新文章

  1. O-GAN:简单修改,让GAN的判别器变成一个编码器!
  2. python语言入门书籍-Python入门书籍有哪些?
  3. 从刷票了解如何获得客户端IP
  4. Spring框架基础知识
  5. vue将原生事件绑定到组件
  6. linux之hexdump命令
  7. 计算机net use命令使用,网络命令net之net use应用
  8. SpringCloud学习笔记(6)----Spring Cloud Netflix之负载均衡-Ribbon的使用
  9. java面试之HashMap延伸出来的--什么是ConcurrentHashMap?
  10. servlet destroy 示例_Servlet中的Listener的应用
  11. 数据库维护管理和监视新特性
  12. 20190823 尚硅谷MySQL核心技术
  13. fer2013人脸表情数据实践
  14. Linux上的查找命令之locate查找
  15. Windows系统监控
  16. 【py】pandas
  17. 联想主板怎么进入bios
  18. openGL基础光照“ADS”( Phone光照模型)(一)
  19. Vue插件element-ui安装时报错error An unexpected error occurred: “https://registry.npmjs.org/element-ui: conn
  20. 基因数据处理8之BWA_MEM小数据集处理(成功)

热门文章

  1. 中国科学技术大学计算机应用,2015年中国科学技术大学081203计算机应用技术考研专业目录及考试科目...
  2. 基于ESP8266与51单片机的震动报警器(车辆报警器)(简单向)
  3. long long整型
  4. linux运行程序 -sh: ./xxxxx: not found 解决办法
  5. Flood fill algorithm
  6. IT网管软件比较一览表
  7. suse linux服务器的常用命令
  8. 最新手机号正则表达式,及生成程序
  9. jquery日期选择插件
  10. 关于STM32中SPI硬件的NSS配置