Java 8 中的哈希表

JDK 的代码是开源的,我们打开idea开发工具,引入jdk1.8  找到hashmap

HashMap 是基于 HashTable 的一种数据结构,在普通哈希表的基础上,它支持多线程操作以及空的 key 和 value。

在 HashMap 中定义了几个常量:

static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16
static final int MAXIMUM_CAPACITY = 1 << 30;
static final float DEFAULT_LOAD_FACTOR = 0.75f;
static final int TREEIFY_THRESHOLD = 8;
static final int UNTREEIFY_THRESHOLD = 6;
static final int MIN_TREEIFY_CAPACITY = 64;

依次解释以上常量:

  1. DEFAULT_INITIAL_CAPACITY: 初始容量,也就是默认会创建 16 个箱子,箱子的个数不能太多或太少。如果太少,很容易触发扩容,如果太多,遍历哈希表会比较慢。
  2. MAXIMUM_CAPACITY: 哈希表最大容量,一般情况下只要内存够用,哈希表不会出现问题。
  3. DEFAULT_LOAD_FACTOR: 默认的负载因子。因此初始情况下,当键值对的数量大于 16 * 0.75 = 12 时,就会触发扩容。
  4. TREEIFY_THRESHOLD: 上文说过,如果哈希函数不合理,即使扩容也无法减少箱子中链表的长度,因此 Java 的处理方案是当链表太长时,转换成红黑树。这个值表示当某个箱子中,链表长度大于 8 时,有可能会转化成树。
  5. UNTREEIFY_THRESHOLD: 在哈希表扩容时,如果发现链表长度小于 6,则会由树重新退化为链表。
  6. MIN_TREEIFY_CAPACITY: 在转变成树之前,还会有一次判断,只有键值对数量大于 64 才会发生转换。这是为了避免在哈希表建立初期,多个键值对恰好被放入了同一个链表中而导致不必要的转化。

学过概率论的读者也许知道,理想状态下哈希表的每个箱子中,元素的数量遵守泊松分布:

 当负载因子为 0.75 时,上述公式中 λ 约等于 0.5,因此箱子中元素个数和概率的关系如下:

数量概率
00.60653066
10.30326533
20.07581633
30.01263606
40.00157952
50.00015795
60.00001316
70.00000094
80.00000006

这就是为什么箱子中链表长度超过 8 以后要变成红黑树,因为在正常情况下出现这种现象的几率小到忽略不计。一旦出现,几乎可以认为是哈希函数设计有问题导致的。

Java 对哈希表的设计一定程度上避免了不恰当的哈希函数导致的性能问题,每一个箱子中的链表可以与红黑树切换。

 

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

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

相关文章

NSJSONSerialization介绍

ios5中apple增加了解析JSON的api——NSJSONSerialization。网上已经有人做过测试&#xff0c;NSJSONSerialization在效率上完胜SBJSON、TouchJSON、YAJL、JSONKit、NextiveJson。详情见这里。既然apple为我们提供了这么良好的工具&#xff0c;我们没理由不用吧。 NSJSONSeriali…

开始新的blog之旅--flash3,0涂鸦板保存,撤销功能

一直以来都是在百度写的博客&#xff0c;今天不知道百度是哪抽风。居然把我的博客给封了&#xff0c;上贴吧去发泄一番&#xff0c;结果帖子都给删了。 不得不说你百度厉害&#xff0c;你自己犯的错误。让我们这些用户跟着受罪。我看今天很多博客都被封了&#xff0c;都不知道原…

JDK8HashMap的扩容核心解读,尾插法

看懂了JDK7Hashmap的扩容头插法&#xff0c;及其可能产生的循环引用问题&#xff0c;今天看看JDK8的HashMap扩容实现。采取的是用四个结点&#xff0c;两条链表完成重新分配位置&#xff0c;比较简单有趣。解析如下&#xff1a; //如果原来的table等于null&#xff0c;直接返回…

领导者的资质——学习笔记(1)

领导者的资质——学习笔记&#xff08;1&#xff09;《领导者的资质》是稻盛和夫先生著作的一本书&#xff0c;书中的道理值得深深思考和体会&#xff0c;结合自己工作、生活中的一些事情&#xff0c;会有不同的感觉。本学习笔记特此记录书中重点的内容&#xff0c;供以后反复阅…

[转帖]ISE与Modelsim联合观察中间信号

如何仿真IP核&#xff08;建立modelsim仿真库完整解析&#xff09; 来源&#xff1a;http://www.ednchina.com/ART_49023_19_0_AN_7116cf44.HTM IP核生成文件&#xff1a;&#xff08;Xilinx/Altera 同&#xff09; IP核生成器生成 ip 后有两个文件对我们比较有用&#xff0c;假…

计算时间复杂度

步骤&#xff1a; 1、找到执行次数最多的语句 2、语句执行语句的数量级 3、用O表示结果 计算时间复杂度的3个出发点&#xff0c;掌握这三个出发点&#xff0c;那么一向搞不懂的时间复杂度就可以迎刃而解啦。 然后&#xff1a; 1、用常数1取代运行时间中的所有加法常数 2、…

领导者的资质——学习笔记(2):领导者的人格

领导者的资质——学习笔记&#xff08;2&#xff09;&#xff1a;领导者的人格在领导者的资质中&#xff0c;人格最为重要。领导者保持自己高层次的人格&#xff0c;是解决当前企业治理危机最根本性的方略。我们要时时事事思考“作为人&#xff0c;何为正确”不断自问自答&…

sql server 2008学习12 事务和锁

事务 事务的点: 1.begin tran 是事务开始的地方,也是 事务回滚的起点.也就说他会忽略这个起点之后的最终没有提交的所有语句, 2.commit tran 事务的提交 是一个事务的终点 当发出 commit tran命令时,可以认为 该事务是 持久的. 撤销已完成事务的唯一方法 是 发出一个新的事务.…

领导者的资质——学习笔记(3):领导者的十项职责

领导者的资质——学习笔记&#xff08;3&#xff09;&#xff1a;领导者的十项职责领导者必须向员工说明工作的目的意义&#xff0c;设定具体目标&#xff0c;制定相应的计划&#xff0c;怀着强烈的愿望&#xff0c;付出不亚于任何人的努力&#xff0c;表现出坚强的意志&#x…

漫画:什么是时间复杂度?

时间复杂度的意义 究竟什么是时间复杂度呢&#xff1f;让我们来想象一个场景&#xff1a;某一天&#xff0c;小灰和大黄同时加入了一个公司...... 一天过后&#xff0c;小灰和大黄各自交付了代码&#xff0c;两端代码实现的功能都差不多。大黄的代码运行一次要花100毫秒&#x…

Eclipse如何连接SQL Server 2005数据库

做管理系统当然少不了经常与数据库打交道&#xff0c;在网上搜了很多数据库版本都不小&#xff0c;大的有好几个G的&#xff0c;小的也有几百兆的&#xff0c;我这可怜的内存&#xff0c;最终找了个精简版中的精简版的Sql server2005&#xff0c;只有80几兆&#xff0c;本来只想…

NLP 最新进展

参考文献&#xff1a; •http://www.dataguru.cn/article-14237-1.html •https://zhuanlan.zhihu.com/p/46652512 •https://github.com/google-research/bert •https://allennlp.org/elmo •https://arxiv.org/pdf/1802.05365 •https://arxiv.org/abs/1810.04805

一句话评论设计模式六大原则

注&#xff1a;转自http://blog.csdn.net/jesse621/article/details/7216331 原则&#xff0c;故名思议则是本质的意思。所谓擒贼先擒王&#xff0c;研究设计模式自然要先了解设计原则&#xff0c;所有的模式都是在这些原则的基础之上发展起来的&#xff0c;有的是侧重一 个&am…

Big GAN

参考文献&#xff1a; •https://github.com/kayamin/DR-GAN •https://www.jianshu.com/p/4ee8f9284b81 •http://cvlab.cse.msu.edu/pdfs/Tran_Yin_Liu_CVPR2017.pdf •https://arxiv.org/abs/1809.11096 •https://juejin.im/entry/5c05e76c51882539c60cf2d5 •https:…

时间复杂度空间复杂度怎么算?

什么是算法 算法的定义是这样的&#xff1a;解题方案的准确而完善的描述&#xff0c;是一系列解决问题的清晰指令。巴拉巴拉的&#xff0c;虽然是一小句但还是不想看&#xff08;题外话&#xff1a;有时候吧专业名词记下来面试的时候还是挺有用的&#xff09;&#xff0c;其实…

什么样的知识,值得我们终生学习

#什么样的知识&#xff0c;值得我们终生学习&#xff1f; 原文&#xff1a;https://dwz.cn/vylyXXJi 一、引言 可能你从初中就开始抱怨&#xff1a;我学相似三角形能干什么&#xff1f;阿伏伽德罗常数有什么用&#xff1f;我一不跳楼&#xff0c;二不高空抛物&#xff0c;学自由…

美团面试题:Hashmap的结构,1.7和1.8有哪些区别,深入的分析

&#xff08;一&#xff09; 真实面试题之&#xff1a;Hashmap的结构&#xff0c;1.7和1.8有哪些区别 不同点&#xff1a; &#xff08;1&#xff09;JDK1.7用的是头插法&#xff0c;而JDK1.8及之后使用的都是尾插法&#xff0c;那么他们为什么要这样做呢&#xff1f;因为JDK1…

作品展结束了,学习才真正的开始

我的作品展旅程分为两个大的部分。 一、班里的事务&#xff08;这是最重要&#xff0c;也最为艰巨的。&#xff09; 从4月15号自考结束后&#xff0c;开始真正进入作品展的筹划阶段。主要和唐欢负责作品的筛选工作&#xff0c;由于我工作经验有限&#xff0c;能力更是有限&…

数据结构第一章概论习题及答案

一、名词解释 1.数据表示 2.数据处理 3.数据 4.数据元素 5.逻辑关系 6.逻辑结构 7.结构 8.运算 9.基本运算 10.存储结构 11.顺序存储结构 12.链式存储结构 13.索引存储结构 14.散列存储结构 15.算法 16.运行终止的程序可执行部分 17.…

管理学习笔记(1)——高效团队的五大关键

高效团队的五大关键1. 安全感&#xff1a;敢于冒险&#xff0c;不会因此干到不安 2. 可靠性&#xff1a;指望他人可以准时完成高质量的工作 3. 结构与清晰度&#xff1a;目标、角色和执行计划都很清楚、明确 4. 工作意义&#xff1a;对各自来说做意义重大的工作 5. 工作影响…