先放一个流程图了解一下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)。

 
 
 

HashMap(1.8)理解的更多相关文章

  1. hashMap 临界值初步理解

    import java.util.*; public class Bs { //Integer.highestOneBit((number - 1) << 1)分解 public stat ...

  2. HashMap源码理解一下?

    HashMap 是一个散列桶(本质是数组+链表),散列桶就是数据结构里面的散列表,每个数组元素是一个Node节点,该节点又链接着多个节点形成一个链表,故一个数组元素 = 一个链表,利用了数组线性查找和 ...

  3. HashMap浅入理解

    HashMap不能保证元素的顺序,HashMap能够将键设为null,也可以将值设为null,与之对应的是Hashtable,(注意大小写:不是HashTable),Hashtable不能将键和值设为 ...

  4. java集合: jdk1.8的hashMap原理简单理解

    HashMap的数据结构 HashMap是数组+链表+红黑树(JDK1.8增加了红黑树部分)实现的,他的底层结构是一个数组,而数组的元素是一个单向链表.HashMap默认初始化的是一个长度为16位的数 ...

  5. HashMap的工作原理深入再深入

    前言 首先再次强调hashcode (==)和equals的真正含义(我记得以前有人会说,equals是判断对象内容,hashcode是判断是否相等之类): equals:是否同一个对象实例.注意,是 ...

  6. 深入Java集合学习系列:HashMap的实现原理--转

    原文出自:http://www.cnblogs.com/xwdreamer/archive/2012/06/03/2532832.html 1. HashMap概述: HashMap是基于哈希表的Ma ...

  7. 面试题 HashMap 数据结构 实现原理

    数据结构 HashMap的数据结构 数据结构中有数组和链表来实现对数据的存储,但这两者基本上是两个极端. 数组:数组存储区间是连续的,占用内存严重,故空间复杂的很大.但数组的二分查找时间复杂度小,为O ...

  8. 转:深入Java集合学习系列:HashMap的实现原理

    1. HashMap概述: HashMap是基于哈希表的Map接口的非同步实现(Hashtable跟HashMap很像,唯一的区别是Hashtalbe中的方法是线程安全的,也就是同步的).此实现提供所 ...

  9. HashMap底层实现原理

    HashMap底层实现 HashMap底层数据结构如下图,HashMap由“hash函数+数组+单链表”3个要素构成 通过写一个迷你版的HashMap来深刻理解 MyMap接口,定义一个接口,对外暴露 ...

随机推荐

  1. Nginx启动,证书报错SSL_CTX_use_PrivateKey_file.....

    报错nginx: [emerg] SSL_CTX_use_PrivateKey_file("/etc/nginx/ssl/myxxxxgame201904.key") failed ...

  2. vue 父子组件通信-props

    父组件:引用了ComBack组件 ComBack组件:引用了BasicInfor组件 先使用props获取父组件的headInfo这个对象,这里注意(default)默认返回值要用工厂形式返回 Bas ...

  3. day 03 数据类型

    1.作业讲解 2.数据类型 什么是数据类型? (1)int 1,2,3用于计算. (2)bool:True,False,用户判断. (3)str:存储少量数据,进行操作 'fjdsal' '二哥',' ...

  4. gitlab安装随记

    gitlab安装 配置yum源 sudo vim /etc/yum.repos.d/gitlab-ce.repo 按照网上别人的例子,修改为清华的源 [gitlab-ce] name=Gitlab C ...

  5. China MVP Community Connection 2017

    在微软北京和小朋友们参加编程一小时活动  

  6. Android直接用手机打包apk!

      你没有看错,用手机浏览器访问Jenkins,就可以打包apk,并生成下载二维码,发送邮件通知测试人员下载,从此解放双手,告别打包测试.先上本人手机邮箱收到的打包成功通知效果图:     废话少说, ...

  7. Intellij 代理抛出异常错误: java.rmi.server.ExportException: Port already in use: 1099,端口被占用

    代理抛出异常错误: java.rmi.server.ExportException: Port already in use: 1099 端口被占用 解决方案: 1.查找出占用进程id 2.杀死进程 ...

  8. web中的请求:get  与 post

    web中get与post请求的区别:1. get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到.post是通过HTTP post机制,将表 ...

  9. [jQuery]判断checkbox是否选中的3种方法

    方法一: if ($("#checkbox-id")get(0).checked) { // do something } 方法二: if($('#checkbox-id').is ...

  10. DBUtils——handler

    ArrayHandler: 把结果集中的第一行数据转成对象数组. ArrayListHandler: 把结果集中的每一行数据都转成一个对象数组,再存放到List中. BeanHandler: 将结果集 ...