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

 

转载于:https://www.cnblogs.com/slfeng/p/11193858.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/263411.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode—274. H 指数

274. H 指数 题目描述: 给你一个整数数组 citations ,其中 citations[i] 表示研究者的第 i 篇论文被引用的次数。计算并返回该研究者的 h 指数。 根据维基百科上 h 指数的定义:h 代表“高引用次数”,一名科研人员的 h指数是指他…

【创业】创业团队的那些事(二)

在上一篇(创业团队的那些事(一))从邮件中看到很多博友的评论,很行赏他们的观点,关于创业团队,我们都有说不完的理论,想不完的创意,干不完的事情,永远无法预知…

日常经典用语、成语及谚语

cross your heart 你发誓       gate - crasher 不请自来的不速之客      take it easy 凡事看开些, 不要太冲动, 不要看得那么重       make yourself comfortable 不用约束 (招待客人时说的话)       you are all wet 你完全误会了       she …

JavaScript复制数组

转载于:https://blog.51cto.com/5880861/1651346

面向对象基础(一)

我想在这个园子里面的新人,还是"掌门人",都对"面向对象"这几字非常的耳熟了或者有一定的了解。 但当一个初学都在学习面向对象的时候,会遇到一些瓶颈和麻烦,认为面向对象非常的难以理解。 那么本章节主要是让…

有哪些简单粗暴的logo设计方法?

Logo设计在设计的过程中要考虑很多问题,但是如果时间周期比较短,又要求快速出方案的时候,可以走一些捷径。 在设计logo之前要去了解公司的主营业务、公司规模、公司的名字、公司的主要产品针对的用户群体、甲方的个人偏好、公司原有VIS...这些…

大数据——Zookeeper学习笔记

具体代码可以参考: https://github.com/Ostrich5yw/java4BigData

事情在不断的解决中,想念巫英才和张国振

最近这几天逐渐完成了不少事情。俱乐部四场技术沙龙、三场培训讲座总算搞完,俱乐部活动也告一段落,我到下学期也快退休了。不少陈年旧债的手尾也完成了。IBM比赛的事情也在进展中,虽然受到前面事情的影响,不是很如意。RFID项目进入…

Java图片处理(二)图片加水印

图片加水印,是通过图片重叠绘制实现的。实现代码如下:public static void press(String pressImg, String pressText, String targetImg,String fontName, int fontStyle, int color, int fontSize, int x, int y) {try {File _file new File(targetImg…

PreTranslateMessage作用和使用方法

PreTranslateMessage是消息在送给TranslateMessage函数之前被调用的,绝大多数本窗口的消息都要通过这里,比较常用,当需要在MFC之前处理某些消息时,常常要在这里添加代码. MFC 消息控制流最具特色的地方是CWnd类的虚拟函数PreTran…

客户端转向小技巧

ASP和asp.net都有很多转向的方法 还有一个小方法 用Response.Write("<script>parent.location.href[urladdress]</script>")输出一个JAVASCRIPT的转向脚本。 这个方法是在页面文件执行完毕后产生的转向&#xff0c;并且是由发送到客户IE上的JAVASCRIPT执…

C#JsonConvert.DeserializeObject反序列化json字符

需求&#xff1a;需要把第一个id替换掉&#xff0c;在序列化成json dynamic dyn Newtonsoft.Json.JsonConvert.DeserializeObject(json);foreach (var obj in dyn){if (obj.Name "id") {obj.Value dbGuid;break;}}string result Newtonsoft.Json.JsonConvert.Se…

大数据——Zookeeper学习笔记(配置)

具体代码可以参考&#xff1a; https://github.com/Ostrich5yw/java4BigData

20. C# -- Base, this 关键字

Base关键字用途用于从派生类中访问基类的成员&#xff0c;调用基类上已被其他方法重写的方法。指定创建派生类实时应调用的基类构造函数。基类访问只能在构造函数&#xff0c;实例方法或实例属性访问器中进行。从静态方法中使用 base 关键字是错误的。Base 主要用于面向对象开发…

微软技术节(TechFest 2010)最前沿技术汇总

Twitter 替代 微博时代行将过渡&#xff0c;微媒时代即将到来! 不错&#xff0c;所谓的高官|明星|名人|红人就在这里哈www.gg3m.com! 马上关注鸽姆微媒吧&#xff0c;再不来你就要OUT勒~[导读]微软亚洲研究院的技术依然是这次技术节的重要组成部分&#xff0c;约有36个项目被选…

case的深入用法

1.case语句中能不能对一个变量进行赋值 转载于:https://www.cnblogs.com/13306511495/archive/2006/10/24/538827.html

MSN Messenger终于好使了

随手写下来&#xff0c;可能其他朋友有些用处。我的机器是windows 2000 prof&#xff0c;公司使用ms proxy&#xff0c;所以我机器上用了ms proxy的客户端mspclnt。原来用msn7.0&#xff0c;在11月ms自己服务器升级之后就开始不太正常。于是从网上找到了msn7.5&#xff0c;想办…

Oracle数据库优化器的优化方式

Oracle是世界领先的信息管理软件开发商&#xff0c;因其复杂的关系数据库产品而闻名。本文介绍Oracle优化器&#xff0c;它是一个非常好用的工具。Oracle在执行一个SQL之前&#xff0c;首先要分析一下语句的执行计划,然后再按执行计划去执行。分析语句的执行计划的工作是由优化…

Linux任务计划

1、at —— 在未来某个时间点执行一次某任务使用实例&#xff1a;at 时间&#xff1a;设定某个时间点at>COMMANDat>Ctrld指定时间&#xff1a;绝对时间&#xff1a;HH:MM&#xff0c;DD.MM.YY&#xff0c;MM/DD/YY相对时间&#xff1a;now3minutes单位&#xff1a;minute…

大数据——Hadoop学习笔记

具体代码可以参考&#xff1a; https://github.com/Ostrich5yw/java4BigData