简介

一般集合和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. java基础之线程池

    一.线程池:提前创建多个线程存放到集合容器中,其中的线程可以反复使用,减少资源的开销 作用就是:线程执行完一个任务,并不被销毁,而是可以继续执行其他的任务 使用线程池中线程对象的步骤: 1. 创建线程 ...

  2. java基础之object类、Date类、System类、StringBuilder类、包装类、枚举类

    一.public String toString() :默认返回该对象的字符串表示,其实该字符串内容就是对象的类型+@+内存地址值 重写后: @Override public String toStr ...

  3. Ubuntu修改密码及密码复杂度策略设置方法

    版本查看 cat /etc/issue cat /proc/version 内核查看 uname -a Ubuntu修改密码及密码复杂度策略设置方法 一.修改密码 1.修改普通用户密码 passwd ...

  4. 解决NET Core发布iis项目覆盖原有的项目时"另一个程序正在使用此文件,进程无法访问"

    解决NET Core发布iis项目覆盖原有的项目时"另一个程序正在使用此文件,进程无法访问" 现在net core运用的多了,一系列的问题接踵而来,更新项目发布到iis时就有一个坑 ...

  5. Multisim14.0安装包免费获取,超详细中文安装步骤助你快速上手!

    Multisim14.0简介 Multisim14.0是由美国国家仪器公司(NI)推出的专业电子设计自动化](EDA)工具,广泛应用于电路设计.仿真验证.教学实验及科研开发领域.其核心功能是通过虚拟仿 ...

  6. K8s新手系列之namespace

    概述 官方文档地址:https://kubernetes.io/zh-cn/docs/tasks/administer-cluster/namespaces/ namespace是K8s系统中的一种非 ...

  7. 遇到的错误之“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 ...

  8. MacOS M1 安装python3.5

    因为没法通过brew直接安装python 3.5,因为brew库里已经没有这个版本的python了,因此只能曲线救国,大体流程: 安装brew 通过brew 安装 pyenv 然后通过pyenv 安装 ...

  9. 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 = ...

  10. File与IO流之字节流

    FileOutputStream 创建字节输出流对象FileOutputStream fl =new FileOutputStream() 传入的参数可以是字符串路径或者File对象(实际上如果传入字 ...