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这个东西,但是当时的程序是单线程的,一切都没有问题.后来,我们的程序性能有问题,所以需要变成多线程的,于是,变成多线程后到了线上,发现 ...
随机推荐
- java基础之线程池
一.线程池:提前创建多个线程存放到集合容器中,其中的线程可以反复使用,减少资源的开销 作用就是:线程执行完一个任务,并不被销毁,而是可以继续执行其他的任务 使用线程池中线程对象的步骤: 1. 创建线程 ...
- java基础之object类、Date类、System类、StringBuilder类、包装类、枚举类
一.public String toString() :默认返回该对象的字符串表示,其实该字符串内容就是对象的类型+@+内存地址值 重写后: @Override public String toStr ...
- Ubuntu修改密码及密码复杂度策略设置方法
版本查看 cat /etc/issue cat /proc/version 内核查看 uname -a Ubuntu修改密码及密码复杂度策略设置方法 一.修改密码 1.修改普通用户密码 passwd ...
- 解决NET Core发布iis项目覆盖原有的项目时"另一个程序正在使用此文件,进程无法访问"
解决NET Core发布iis项目覆盖原有的项目时"另一个程序正在使用此文件,进程无法访问" 现在net core运用的多了,一系列的问题接踵而来,更新项目发布到iis时就有一个坑 ...
- Multisim14.0安装包免费获取,超详细中文安装步骤助你快速上手!
Multisim14.0简介 Multisim14.0是由美国国家仪器公司(NI)推出的专业电子设计自动化](EDA)工具,广泛应用于电路设计.仿真验证.教学实验及科研开发领域.其核心功能是通过虚拟仿 ...
- K8s新手系列之namespace
概述 官方文档地址:https://kubernetes.io/zh-cn/docs/tasks/administer-cluster/namespaces/ namespace是K8s系统中的一种非 ...
- 遇到的错误之“Could not copy property 'repositoryId' from source to target; nested exception is java.lang.reflect.InvocationTargetException”
[ERROR][2023-09-03 21:54:10] | Combination收入费用数据导出异常 org.springframework.beans.FatalBeanException: C ...
- MacOS M1 安装python3.5
因为没法通过brew直接安装python 3.5,因为brew库里已经没有这个版本的python了,因此只能曲线救国,大体流程: 安装brew 通过brew 安装 pyenv 然后通过pyenv 安装 ...
- ASP.NET Core Minimal API之optional route parameter with default value and optional route parameter
public static void Main(string[] args) { var builder = WebApplication.CreateBuilder(args); var app = ...
- File与IO流之字节流
FileOutputStream 创建字节输出流对象FileOutputStream fl =new FileOutputStream() 传入的参数可以是字符串路径或者File对象(实际上如果传入字 ...