java hashmap 浅出深入
简介
一般集合和map的底层原理实现可能会被面试官问到.
参考链接
https://www.bilibili.com/video/BV1oE411n7ug?from=search&seid=4551060475011719922
https://www.bilibili.com/video/BV1kJ411C7hC?from=search&seid=11022586264795253983
https://zhuanlan.zhihu.com/p/143826469
https://blog.csdn.net/g6U8W7p06dCO99fQ3/article/details/104681428/ hashmap死循环
参数
- DEFAULT_LOAD_FACTOR
static final float DEFAULT_LOAD_FACTOR = 0.75f; 负载因子
2. 门限
// (The javadoc description is true upon serialization.
// Additionally, if the table array has not been allocated, this
// field holds the initial array capacity, or zero signifying
// DEFAULT_INITIAL_CAPACITY.)
int threshold;
门限计算公式
threshold = 数组长度 * 负载因子;
size
size 是HashMap中实习存在的键值对数量
/**
* The number of key-value mappings contained in this map.
*/
transient int size;
modCount
hashmap 发生结构变化的次数.
/**
* The number of times this HashMap has been structurally modified
* Structural modifications are those that change the number of mappings in
* the HashMap or otherwise modify its internal structure (e.g.,
* rehash). This field is used to make iterators on Collection-views of
* the HashMap fail-fast. (See ConcurrentModificationException).
*/
transient int modCount;
INITIAL_CAPACITY
/**
* The default initial capacity - MUST be a power of two.
*/
static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16
初始化容量为16.
为什么选用2的幂次
因为 比如16: 1 0000
16 - 1 = 0 1111
使用这个对hashcode产生的书进行与操作 可以得到16以内的数
hashCode 如何将高位也进行与操作 减少冲突
static final int hash(Object key) {
int h;
return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}
hashmap 1.7 采用头插法, 1.8 采用尾插法 为什么
因为每次都要查询链表是不是8个, 所以查询结束直接尾插法,效率较高
HashMap 发生死循环的一个重要原因是 JDK 1.7 时链表的插入是首部倒序插入的,而 JDK 1.8 时已经变成了尾部插入,有人把这个死循环的问题反馈给了 Sun 公司,但它们认为这不是一个问题,因为 HashMap 本身就是非线程安全的,如果要在多线程使用建议使用 ConcurrentHashMap 替代 HashMap,但面试中这个问题被问的频率比较高,所以在这里就特殊说明一下。

1.8 每次链表长度到8都会扩容吗
不会哦. 有一个64的参数, 如果没有达到64的话, 会先进行扩容.
TIPS

hashmap 采用了数组 + 链表 + 红黑树 jdk.18的存储结构.
hashmap 数组部分称为哈希桶. 当链表长度大于等于8时, 链表数据将以红黑树的形式进行存储, 当长度降到6时, 转成链表.
链表的时间复杂度为O(n)
红黑树的时间复杂度为O(log n)
当插入的对象大小超过临界值时, HashMap将新建一个桶数组并重新赋值. 此时, 桶数组是原来的两倍, 门限也是原来的两倍. 然后从新赋值
参考链接
https://blog.csdn.net/leisure_life/article/details/108482840 对于第一个元素put所进行的操作.
推荐阅读
https://www.cnblogs.com/zwh0910/p/14354328.html resize() 代码分析
https://www.cnblogs.com/shujiying/p/12357452.html resize() 图形化显示
java hashmap 浅出深入的更多相关文章
- [翻译]Java HashMap工作原理
大部分Java开发者都在使用Map,特别是HashMap.HashMap是一种简单但强大的方式去存储和获取数据.但有多少开发者知道HashMap内部如何工作呢?几天前,我阅读了java.util.Ha ...
- Java学习笔记(二二)——Java HashMap
[前面的话] 早上起来好瞌睡哈,最近要注意一样作息状态. HashMap好好学习一下. [定义] Hashmap:是一个散列表,它存储的内容是键值对(key——value)映射.允许nul ...
- java集合框架之java HashMap代码解析
java集合框架之java HashMap代码解析 文章Java集合框架综述后,具体集合类的代码,首先以既熟悉又陌生的HashMap开始. 源自http://www.codeceo.com/arti ...
- HashMap的原理与实 无锁队列的实现Java HashMap的死循环 red black tree
http://www.cnblogs.com/fornever/archive/2011/12/02/2270692.html https://zh.wikipedia.org/wiki/%E7%BA ...
- 【转】Java HashMap工作原理(好文章)
大部分Java开发者都在使用Map,特别是HashMap.HashMap是一种简单但强大的方式去存储和获取数据.但有多少开发者知道HashMap内部如何工作呢?几天前,我阅读了java.util.Ha ...
- 【转】Java HashMap 源码解析(好文章)
.fluid-width-video-wrapper { width: 100%; position: relative; padding: 0; } .fluid-width-video-wra ...
- 转:Java HashMap实现详解
Java HashMap实现详解 转:http://beyond99.blog.51cto.com/1469451/429789 1. HashMap概述: HashMap是基于哈希表的M ...
- 自学Java HashMap源码
自学Java HashMap源码 参考:http://zhangshixi.iteye.com/blog/672697 HashMap概述 HashMap是基于哈希表的Map接口的非同步实现.此实现提 ...
- Java HashMap工作原理及实现
Java HashMap工作原理及实现 2016/03/20 | 分类: 基础技术 | 0 条评论 | 标签: HASHMAP 分享到:3 原文出处: Yikun 1. 概述 从本文你可以学习到: 什 ...
- 【转】Java HashMap的死循环
问题的症状 从前我们的Java代码因为一些原因使用了HashMap这个东西,但是当时的程序是单线程的,一切都没有问题.后来,我们的程序性能有问题,所以需要变成多线程的,于是,变成多线程后到了线上,发现 ...
随机推荐
- 使用JSR303进行校验
4.JSR303 1).给Bean添加校验注解:javax.validation.constraints,并定义自己的message提示 2).开启校验功能@Valid 效果:校验错误以后会有默认的响 ...
- 用ResourceHacker修改EXE图标
1.打开ResourceHacker.exe 2.点击文件-打开-选择你需要修改的exe文件 3.点击操作-添加图像或二进制文件 4.点击选择文件-选择ico图标-添加资源 5.点击绿色保存图标 6. ...
- 【work记录:c++web聊天服务器】解决了聊天窗口的问题|修复了"没有区分好友或者群聊的聊天窗口"的bug|修复了"群聊消息undefined"的bug
日期:2025.4.24 学习内容: 解决了聊天窗口的问题 修复了"没有区分好友或者群聊的聊天窗口"的bug 修复了"群聊消息undefined"的bug 个人 ...
- sql学习day3——case when的使用
1,当前表 course_master open_course ...
- python初学之random()模块
##python小脚本 random()是不能直接访问的,需要导入 random 模块,然后通过 random 静态对象调用该方法. random.random()用于生成 一个指定范围内的随机符点数 ...
- 【记录】博客|Markdown写作常用的符号表示、公式写法合集
文章目录 基础内容Basic 1.符号合集 2.LaTeX公式输入 附加内容Addition 1.公式左对齐 2.Markdown文档导出的PDF分页 基础内容Basic 1.符号合集 LATEX M ...
- 使用php的openssl_encrypt和python的pycrypt进行跨语言的对称加密和解密问题
最近有一个业务需求,需要前端传递一个密码到后端,期间要对传递的密码通过进行对称加密,我们约定使用成熟的AES加密方法. 前端使用php,后端用python,但是发现前端兄弟加密后的字符串,在pytho ...
- 数据库迁移的艺术:FastAPI生产环境中的灰度发布与回滚策略
title: 数据库迁移的艺术:FastAPI生产环境中的灰度发布与回滚策略 date: 2025/05/17 21:06:56 updated: 2025/05/17 21:06:56 author ...
- AssemblyResolve巧解未能加载文件或程序集“Newtonsoft.Json, Version=6.0.0.0的问题
问题:未能加载文件或程序集"Newtonsoft.Json, Version=6.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aee ...
- 异步日志监控:FastAPI与MongoDB的高效整合之道
title: 异步日志监控:FastAPI与MongoDB的高效整合之道 date: 2025/05/27 17:49:39 updated: 2025/05/27 17:49:39 author: ...