简介

一般集合和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死循环

参数

  1. 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 浅出深入的更多相关文章

  1. [翻译]Java HashMap工作原理

    大部分Java开发者都在使用Map,特别是HashMap.HashMap是一种简单但强大的方式去存储和获取数据.但有多少开发者知道HashMap内部如何工作呢?几天前,我阅读了java.util.Ha ...

  2. Java学习笔记(二二)——Java HashMap

    [前面的话] 早上起来好瞌睡哈,最近要注意一样作息状态.       HashMap好好学习一下. [定义] Hashmap:是一个散列表,它存储的内容是键值对(key——value)映射.允许nul ...

  3. java集合框架之java HashMap代码解析

     java集合框架之java HashMap代码解析 文章Java集合框架综述后,具体集合类的代码,首先以既熟悉又陌生的HashMap开始. 源自http://www.codeceo.com/arti ...

  4. HashMap的原理与实 无锁队列的实现Java HashMap的死循环 red black tree

    http://www.cnblogs.com/fornever/archive/2011/12/02/2270692.html https://zh.wikipedia.org/wiki/%E7%BA ...

  5. 【转】Java HashMap工作原理(好文章)

    大部分Java开发者都在使用Map,特别是HashMap.HashMap是一种简单但强大的方式去存储和获取数据.但有多少开发者知道HashMap内部如何工作呢?几天前,我阅读了java.util.Ha ...

  6. 【转】Java HashMap 源码解析(好文章)

    ­ .fluid-width-video-wrapper { width: 100%; position: relative; padding: 0; } .fluid-width-video-wra ...

  7. 转:Java HashMap实现详解

    Java HashMap实现详解 转:http://beyond99.blog.51cto.com/1469451/429789 1.    HashMap概述:    HashMap是基于哈希表的M ...

  8. 自学Java HashMap源码

    自学Java HashMap源码 参考:http://zhangshixi.iteye.com/blog/672697 HashMap概述 HashMap是基于哈希表的Map接口的非同步实现.此实现提 ...

  9. Java HashMap工作原理及实现

    Java HashMap工作原理及实现 2016/03/20 | 分类: 基础技术 | 0 条评论 | 标签: HASHMAP 分享到:3 原文出处: Yikun 1. 概述 从本文你可以学习到: 什 ...

  10. 【转】Java HashMap的死循环

    问题的症状 从前我们的Java代码因为一些原因使用了HashMap这个东西,但是当时的程序是单线程的,一切都没有问题.后来,我们的程序性能有问题,所以需要变成多线程的,于是,变成多线程后到了线上,发现 ...

随机推荐

  1. 使用JSR303进行校验

    4.JSR303 1).给Bean添加校验注解:javax.validation.constraints,并定义自己的message提示 2).开启校验功能@Valid 效果:校验错误以后会有默认的响 ...

  2. 用ResourceHacker修改EXE图标

    1.打开ResourceHacker.exe 2.点击文件-打开-选择你需要修改的exe文件 3.点击操作-添加图像或二进制文件 4.点击选择文件-选择ico图标-添加资源 5.点击绿色保存图标 6. ...

  3. 【work记录:c++web聊天服务器】解决了聊天窗口的问题|修复了"没有区分好友或者群聊的聊天窗口"的bug|修复了"群聊消息undefined"的bug

    日期:2025.4.24 学习内容: 解决了聊天窗口的问题 修复了"没有区分好友或者群聊的聊天窗口"的bug 修复了"群聊消息undefined"的bug 个人 ...

  4. sql学习day3——case when的使用

    1,当前表 course_master                                                            open_course           ...

  5. python初学之random()模块

    ##python小脚本 random()是不能直接访问的,需要导入 random 模块,然后通过 random 静态对象调用该方法. random.random()用于生成 一个指定范围内的随机符点数 ...

  6. 【记录】博客|Markdown写作常用的符号表示、公式写法合集

    文章目录 基础内容Basic 1.符号合集 2.LaTeX公式输入 附加内容Addition 1.公式左对齐 2.Markdown文档导出的PDF分页 基础内容Basic 1.符号合集 LATEX M ...

  7. 使用php的openssl_encrypt和python的pycrypt进行跨语言的对称加密和解密问题

    最近有一个业务需求,需要前端传递一个密码到后端,期间要对传递的密码通过进行对称加密,我们约定使用成熟的AES加密方法. 前端使用php,后端用python,但是发现前端兄弟加密后的字符串,在pytho ...

  8. 数据库迁移的艺术:FastAPI生产环境中的灰度发布与回滚策略

    title: 数据库迁移的艺术:FastAPI生产环境中的灰度发布与回滚策略 date: 2025/05/17 21:06:56 updated: 2025/05/17 21:06:56 author ...

  9. AssemblyResolve巧解未能加载文件或程序集“Newtonsoft.Json, Version=6.0.0.0的问题

    问题:未能加载文件或程序集"Newtonsoft.Json, Version=6.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aee ...

  10. 异步日志监控:FastAPI与MongoDB的高效整合之道

    title: 异步日志监控:FastAPI与MongoDB的高效整合之道 date: 2025/05/27 17:49:39 updated: 2025/05/27 17:49:39 author: ...