HashMap结构-程序员宅基地

技术标签: hashmap  hashmap结构  hashmap版本区别  

HashMap结构及版本区别

1、HashMap:

继承于AbstractMap,实现了Map、Cloneable、java.io.Serializable接口。

是散列分布存储的,通过key/value结构实现。其中key和value都可以是null,是无序的。

2、HashMap的结构

2.1、jdk1.7采用 数组+ 单链表的数据结构

hashMap 在1.7的结构

hash表是一个数组,根据索引将条目存入hash表中,如果出现hash索引相同的时候,将会以链表的形式在同一个索引处储存多个条目,后来的条目存在在链表最后边(头插法)。

【什么是hashmap头插法:https://blog.csdn.net/styhm/article/details/111212508

2.2、jdk1.8后,HashMap的结构是数组+链表+红黑树

从JAVA 7中得知,在查找元素时候,可以根据hash值快速定位到数组具体的下标,但是后面的操作需要顺着链表一个一个的比较下去才能找到所需值,时间复杂度取决于链表的长度,为O(n),为了降低这一部分处理的开销,在JAVA 8中,当链表中的元素超过8个之后,会将链表转换为红黑树,在这些位置进行查找的时候可降低时间复杂度 为O(logn)。当红黑树节点数小于6就会变成链表。

3、HashMap 初始容量与加载因子。

当HashMap实例化时会涉及初始化容量,初始化容量默认是16.


/**
 * The default initial capacity - MUST be a power of two.
 */
static final int DEFAULT_INITIAL_CAPACITY = 16;// 默认初始容量为16,必须为2的幂

当hash表中的条目数超过 容量 * 加载因子时,通过调用 rehash 方法(resize)将容量翻倍。

其中需要注意的是容量设置必须是2的整数次幂。那么为什么,必须是2的整数次幂呢?

hashmap中默认加载因子0.75

    /**
     * The load factor used when none specified in constructor.
     */
    static final float DEFAULT_LOAD_FACTOR = 0.75f;

为什么加载因子默认是0.75,而不是1呢,这要从空间(hash容量)和时间(存入是否发生碰撞,取是否需要遍历链表)两个方面综合评价。从而得出的一个较为调优的值0.75

4、hashMap的hash是怎么计算的

hashmap怎么将给加入进来的元素散列分布在table表的各个位置的呢

参考文章https://blog.csdn.net/styhm/article/details/109778522

5、线程安全问题

https://blog.csdn.net/styhm/article/details/111227027

线程安全的HashMap可以用代替

ConcurrentHashMap map = new ConcurrentHashMap(32);

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/styhm/article/details/111227145

智能推荐

斗地主——找出顺子的算法-程序员宅基地

文章浏览阅读2k次。1 static List<crads> shuen(List<crads> list) 2 { 3 List<crads> cList = new List<crads>(); 4 for (int i = 0; i < list.Count;++i) ...

Thinkpad T460P安装win7_t460p支持win7吗-程序员宅基地

文章浏览阅读2.1w次。Thinkpad T460P安装win7 Skylake平台装Windows7_t460p支持win7吗

百事可乐⋅顺风车⋅迷路⋅出租车_百事顺风车-程序员宅基地

文章浏览阅读1.4k次。亲身经历的四段小事,早想写出来,一直拖到现在。今日做个小记,待日后慢慢品味。百事可乐 09年年初初来京时,居住在一个偏僻的村子里,村子虽小,日常生活都可以在这里解决。当时收入不多,为了省钱,每天早晨都会去一家简陋的小馆子里吃“炸油饼”。去的多了,渐渐的就与馆子的老板_百事顺风车

Android请求网络数据,json解析-FastJson遇到的问题 首字母大写问题_android网络请求大小写问题-程序员宅基地

文章浏览阅读842次。在Android app开发过程中,用fastjson获取后台数据,后台返回的数据:[{"doseFrequencyList":[{"FrequencyCode":"ed","name":"每天","ordinal":"1"},{"FrequencyCode":"iod","name":"隔天","ordinal":"2"},{"FrequencyCode":"iow","name":"隔周","_android网络请求大小写问题

cheerio制作markDown索引目录_toc-wrapper-程序员宅基地

文章浏览阅读235次。原文链接:Bougie的博客 制作目录索引这种东西当然是放在前端方便。选择放在后端一是为了了解Node后端生态,掌握更多后端技术;二是因为公司实行前后端分离的方式开发,睾贵的JAVA后端经常啥也不做处理就返回一个row数据(甚至有时时间戳都不处理),对此有些无语。最终目标 1. 点击索引单项跳转到相应标题 2. 大号标题包含小号标题,小号标题向右缩进 3. 滚动页面时自..._toc-wrapper

RESTEasy:@FormParam、@PathParam、@QueryParam、@HeaderParam、@CookieParam、@MatrixPara-程序员宅基地

文章浏览阅读151次。介绍:In the first RESTEasy tutorial we have learnt the basics about REST Web services and we have tested a simple RESTful Web service. In this tutorial we willshow how to inject web application eleme..._@headerparam@queryparam

随便推点

山东春考计算机本科学校分数线,2016年山东春季高考各校计算机专业录取分数线分别是多少?...-程序员宅基地

文章浏览阅读1.4k次。2016年山东春季高考各校计算机专业录取分数线分别是多少?以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!2016年山东春季高考各校计算机专业录取分数线分别是多少?2016年山东春季高考各校计算机专业录取分数线分别是多少?1、2016年全国各省份高考成绩及各批次控制分数线公布时间都集中在6月23-26日之间,预测的分数线..._山东滨州学院计算机专业春考本科分数线

Asp.net 2.0自定义控件(点击HyperLink后执行事件)[网友问题: DataList里HyperLink控件激发事件,在哪定义?]...-程序员宅基地

文章浏览阅读151次。(一). 概述HyperLink默认没有Click事件, 重写了一个HyperLink自定义控件. 实现原理: 默认Hyperlink是跳到点击请求的页面, 本HyperLink自定义控件最终也是跳转到请求的页面, 但期间执行了自己的一个方法, 我们可以在此方法中添写自己所需的功能. 本示例演示统计此超链接点击次数功能. [参考Asp.net 2.0高级编程](二). 代..._hyperlink控件后台点击方法

HBASE 启动报错 Can't get connection to ZooKeeper: KeeperErrorCode = ConnectionLoss for /hbase-程序员宅基地

文章浏览阅读9k次,点赞3次,收藏6次。查看防火墙状态$ service iptables status关闭防火墙$ service iptables stop查看防火墙状态$ service iptables status停止hbase$ stop-hbase.sh启动hbase$ start-hbase.sh_can't get connection to zookeeper: keepererrorcode = connectionloss for /hba

华为智慧屏鸿蒙系统手工升级,华为的“中场战事”:升级智能家居、推鸿蒙智慧屏,重构IoT赛道?...-程序员宅基地

文章浏览阅读324次。进一步切入全屋智能、大屏、车机等全场景。2020年,华为消费者业务的产品线纵深正进一步拓展。12月21日,华为面向家庭、出行场景正式发布了三大系列产品。其一是华为智能家居战略及全屋智能解决方案,顾名思义,是提升家居生活智能化的软硬件体系;其二是华为智慧屏S系列,搭载了鸿蒙OS最新版本,该系列是华为智慧屏家族的新成员,产品定位中低端市场,拥有55、65、75寸三种屏幕尺寸共6款机型;其三是车载智慧屏...

CMenu类中禁用/变灰某一项-程序员宅基地

文章浏览阅读322次。CMenu::EnableMenuItem启用、 禁用,或变暗的菜单项。UINT EnableMenuItem(UINT nIDEnableItem, UINT nEnable);参数nIDEnableItem根据所指定的菜单项,若要启用,nEnable。 弹出菜单项,以及标准菜单项,可以指定此参数。nEnable指定要执行的操作。 它可以是组合的M..._cmenu 菜单项置灰

php扩展memcached、memcache、redis的安装配置方法-程序员宅基地

文章浏览阅读167次。php连接memcached缓存服务器的客户端有两个,一个是memcache是比较底层的开发库,memcached是比较新的开发库,php安装这两个扩展中的任意一个后就可以在编写php代码时使用的memcached缓存数据,达到缓存php执行的结果1、安装memcachetar -zxvfmemcache-2.2.7.tgzcdmemcache-2.2.7/usr/loc..._群晖添加phpredis扩展

推荐文章

热门文章

相关标签