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;
依次解释以上常量:
DEFAULT_INITIAL_CAPACITY
: 初始容量,也就是默认会创建 16 个箱子,箱子的个数不能太多或太少。如果太少,很容易触发扩容,如果太多,遍历哈希表会比较慢。MAXIMUM_CAPACITY
: 哈希表最大容量,一般情况下只要内存够用,哈希表不会出现问题。DEFAULT_LOAD_FACTOR
: 默认的负载因子。因此初始情况下,当键值对的数量大于16 * 0.75 = 12
时,就会触发扩容。TREEIFY_THRESHOLD
: 上文说过,如果哈希函数不合理,即使扩容也无法减少箱子中链表的长度,因此 Java 的处理方案是当链表太长时,转换成红黑树。这个值表示当某个箱子中,链表长度大于 8 时,有可能会转化成树。UNTREEIFY_THRESHOLD
: 在哈希表扩容时,如果发现链表长度小于 6,则会由树重新退化为链表。MIN_TREEIFY_CAPACITY
: 在转变成树之前,还会有一次判断,只有键值对数量大于 64 才会发生转换。这是为了避免在哈希表建立初期,多个键值对恰好被放入了同一个链表中而导致不必要的转化。
学过概率论的读者也许知道,理想状态下哈希表的每个箱子中,元素的数量遵守泊松分布:
当负载因子为 0.75 时,上述公式中 λ 约等于 0.5,因此箱子中元素个数和概率的关系如下:
数量 | 概率 |
---|---|
0 | 0.60653066 |
1 | 0.30326533 |
2 | 0.07581633 |
3 | 0.01263606 |
4 | 0.00157952 |
5 | 0.00015795 |
6 | 0.00001316 |
7 | 0.00000094 |
8 | 0.00000006 |
这就是为什么箱子中链表长度超过 8 以后要变成红黑树,因为在正常情况下出现这种现象的几率小到忽略不计。一旦出现,几乎可以认为是哈希函数设计有问题导致的。
Java 对哈希表的设计一定程度上避免了不恰当的哈希函数导致的性能问题,每一个箱子中的链表可以与红黑树切换。
Java 8 中的哈希表相关推荐
- 哈希表 matlab实现,MATLAB中的哈希表
MATLAB中的哈希表 MATLAB是否支持散列表? 一些背景 我正在研究Matlab中的一个问题,需要图像的尺度空间表示. 为了做到这一点,我创build了一个二维高斯滤波器,在一定范围内为方差si ...
- PHP内核中的哈希表结构
https://github.com/HonestQiao/tipi/commit/17ca680289e490763a6a402f79afa2a13802bb36 下载:https://github ...
- c ++中哈希表如何访问_C / C ++中的哈希表–完整的实现
c ++中哈希表如何访问 A Hash Table in C/C++ (Associative array) is a data structure that maps keys to values. ...
- 一文看懂哈希表并学会使用C++ STL 中的哈希表
最近在刷题以及做编程练习的作业时经常会用到哈希表,碰到一些想用的函数时每次都看别人的博客,现结合别人的博客对哈希表做个总结. 本篇博客的主要内容如下 1. 哈希表的定义 2. 如何使用STL库 ...
- 在C#中应用哈希表(Hashtable)
一,哈希表(Hashtable)简述 在.NET Framework中,Hashtable是System.Collections命名空间提供的一个容器,用于处理和表现类似key/value的键值对,其 ...
- dbeaver导出表结构和数据_python中的哈希表数据结构
散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构.也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度.这个映射函数叫做散列 ...
- php hash代码下载,PHP中的哈希表 hash_insert
[php]代码库int hash_insert(HashTable *ht, char *key, void *value) { // check if we need to resize the h ...
- 【LeetCode笔记】146. LRU缓存机制(Java、双向链表、哈希表)
文章目录 题目描述 思路 & 代码 LinkedHashMap 的写法 题目描述 大名鼎鼎的超高频面试题 太感动,在这道题上花了太多时间了,今天终于补上博客了TvT 思路 & 代码 结 ...
- 1022 Digital Library (30 分) 【难度: 中 / 知识点: 哈希表】
https://pintia.cn/problem-sets/994805342720868352/problems/994805480801550336 解析: 将每一部分都用哈希表映射.映射的结果 ...
最新文章
- windows共享wifi
- Python如何使用不同分隔符切分字符串
- 通过过滤器防止用户通过url访问不在权限内的菜单
- 如何高效学Python?好用的爬虫工具又有哪些?
- iOS中加载Flutter中的图片
- PAT乙级 1039 到底买不买
- 鸿蒙OS加持!华为MatePad2系列将搭载骁龙888/麒麟9000芯
- apex图表使用饼图居中_还在用单饼图展示Excel数据?一分钟学会制作复合饼图
- Linux文件类型及颜色标识整理
- 云数据库MySQL5.7单机基础版上线
- 如何使用pytorch下载MNIST数据集
- 《Python黑帽子:黑客与渗透测试编程之道》读书笔记(六):基于github的木马
- url传参的编码与解码
- java编写个人所得税_个人所得税JAVA算法
- 「圆桌」无人驾驶何时来?| 甲子引力
- PostgreSQL JIT(Just-In-Time Compilation)With LLVM 的实现原理
- 维度数据建模的概念和术语
- python 下载pip命令
- ES6 lterator迭代器是个什么东西?有什么用?
- CUDA内存管理一文理清|参加CUDA线上训练营
热门文章
- redis timeout设置多少合适_热水器怎么调温度?一般热水器温度设置多少度比较合适?...
- 自定义键盘码_无线+矮轴≤299?ikbc S200 2.4G 机械键盘测评
- Logistic回归——二分类 —— matlab
- C++ PAT 乙级 ——1002 读入一个正整数 n,计算其各位数字之和,用汉语拼音写出和的每一位数字。
- php数组里面写路径,使用路径在PHP数组中进行递归搜索
- 永恒python配合什么主武器好_学点python吧,别再这么累了,让你轻松实现财富自由...
- python json文件传输图片
- Django - - - -视图层之视图函数(views)
- 【债券】可转换债券基本概念
- [51nod1201]整数划分