库调多了,都忘了最基础的概念 -HashMap 篇

简介: 库调多了,都忘了最基础的概念 -HashMap 篇

🍁 作者:知识浅谈,CSDN博客专家,阿里云签约博主,InfoQ签约博主,华为云云享专家

📌 擅长领域:全栈工程师、爬虫、ACM算法

💒 公众号:知识浅谈

温馨提醒:由于内容较好,请18岁以上成年人观看

🤞这次都给他拿下🤞

🎈说一下HashMap底层实现?及元素添加流程?

因为JDK1.7和JDK1.8是有区别的,所以按照不同的版本记录

JDK1.7版本:

  1. 底层结构使用数组+链表的方式实现。
  2. 数组中最初的大小为16个节点,阈值为0.75,当达到阈值的时候进行扩容,扩容每次扩容为原来的2倍。
  3. 链表插入节点的时候使用头插法。

😉元素添加的过程:这个版本的元素添加是先判断是否达到阈值,即先扩容,后添加。

添加的时候找到对应的位置,如果为空进行赋值,否则如果是链表采用头插法把值插入。

🧐存在的问题:存在循环链表和值覆盖的问题。

JDK1.8版本:

  1. 底层结构使用数组+链表+红黑树的方式实现。
  2. 数组中最初的大小为16个节点,阈值为0.75,当达到阈值的时候进行扩容,扩容每次扩容为原来的2倍,相比于JDK1.7还有一点就是当链表的节点数大于8且整个map中元素的个数大于64的时候,链表转化为红黑树,当链表中的节点数小于6的时候,红黑树退化为链表。
  3. 链表插入节点的时候使用尾插法。

😉元素添加的过程:这个版本的元素添加是先添加,后判断是否进行扩容。

添加的时候找到对应的位置,如果为空进行赋值,否则如果是链表采用尾部插法把值插入,否则如果是红黑树,则在红黑树中插入对应的节点。

🧐存在的问题: 解决了循环链表的问题,但是仍然存在值覆盖的问题。

🎈为什么HashMap会产生死循环?

这个死循环就是上边提到的循环链表的问题,这个问题是发生在扩容的时候,当多个线程进行节点并发插入的时候,都需要进行扩容,一个线程扩容完,另一个线程本来在前一个线程扩容之前已经指向原本的头节点,扩容之后头节点指向的next节点变化了,当第二个线程扩容的时候就行成了循环。

🎈HashMap除了死循环之外,还有什么问题?

正如上边提到的,除了死循环,还有值覆盖的问题,就是当数组中的一个节点为空的时候两个元素要同时插入的时候当一个节点获取了位置要插入的时候,时间片到了,另一个线程插入了,之后到另一个线程的时候也进行了插入,就把之前的给覆盖了。

🎈为什么ConcurrentHashMap是线程安全的?

📐JDK1.7版本:

使用分段锁的形式,即用segment数组来进行加锁的形式,每个锁下记录一个数组+链表的结构,这个数组的初始值和阈值为16和0.75,同理每个segment下都是如此,为什么concurrentHashMap是安全的,就是因为当修改的时候先锁住一个段下的所有内容进行修改,如果不同段中的数据,是可以并行修改的。

📐JDK1.8版本:

采用Synchronized+CMS的形式,就是对数组中每个节点加synchronized的形式,然后在进行扩容,sychronized锁住结点之后使用CMS的方法进行扩容,并且还支持并发扩容,也就是可以多个线程同时进行扩容,且扩容不用计算hash值,如果之前的hash大于原来的数组则就把当前节点移动到当前节点+原数组长度的位置。

🍚总结

以上就是关于hashmap的简单理解,太深了我也不太理解,希望有所帮助。

相关文章
|
3月前
|
存储 网络协议 Java
【Spring全家桶】Spring Cloud 2023.0.x:服务注册与发现:Nacos、Eureka、Consul(附《思维导图》+《面试高频考点清单》)
本文系统梳理Spring Cloud 2023.0.x(Leyton)服务注册与发现核心体系,涵盖Nacos(AP/CP双模)、Consul(CP)、Eureka(维护模式)三大组件原理、对比与实战,深度解析CAP理论、健康检查、高可用集群及迁移方案,助力微服务架构落地。
|
XML Java 数据格式
【spring源码系列-05】refresh中prepareRefresh方法的执行流程
【spring源码系列-05】refresh中prepareRefresh方法的执行流程
597 0
|
人工智能 Java 开发者
【Spring】原理解析:Spring Boot 自动配置
Spring Boot通过“约定优于配置”的设计理念,自动检测项目依赖并根据这些依赖自动装配相应的Bean,从而解放开发者从繁琐的配置工作中解脱出来,专注于业务逻辑实现。
3091 0
|
存储 缓存 NoSQL
Redis常见面试题(二):redis分布式锁、redisson、主从一致性、Redlock红锁;Redis集群、主从复制,哨兵模式,分片集群;Redis为什么这么快,I/O多路复用模型
redis分布式锁、redisson、可重入、主从一致性、WatchDog、Redlock红锁、zookeeper;Redis集群、主从复制,全量同步、增量同步;哨兵,分片集群,Redis为什么这么快,I/O多路复用模型——用户空间和内核空间、阻塞IO、非阻塞IO、IO多路复用,Redis网络模型
Redis常见面试题(二):redis分布式锁、redisson、主从一致性、Redlock红锁;Redis集群、主从复制,哨兵模式,分片集群;Redis为什么这么快,I/O多路复用模型
|
Java Spring 容器
Spring IOC、AOP与事务管理底层原理及源码解析
【10月更文挑战第1天】Spring框架以其强大的控制反转(IOC)和面向切面编程(AOP)功能,成为Java企业级开发中的首选框架。本文将深入探讨Spring IOC和AOP的底层原理,并通过源码解析来揭示其实现机制。同时,我们还将探讨Spring事务管理的核心原理,并给出相应的源码示例。
685 9
|
存储 算法 索引
HashMap底层数据结构及其增put删remove查get方法的代码实现原理
HashMap 是基于数组 + 链表 + 红黑树实现的高效键值对存储结构。默认初始容量为16,负载因子为0.75。当存储元素超过容量 * 负载因子时,会进行扩容。HashMap 使用哈希算法计算键的索引位置,通过链表或红黑树解决哈希冲突,确保高效存取。插入、获取和删除操作的时间复杂度接近 O(1)。
498 0
|
Java 开发者 Spring
Spring bean的生命周期详解!
本文详细介绍了Spring框架中的核心概念——Spring Bean的生命周期,包括实例化、属性赋值、接口回调、初始化、使用及销毁等10个阶段,并深入剖析了相关源码,如`BeanFactory`、`DefaultListableBeanFactory`和`BeanPostProcessor`等关键类与接口。通过理解这些核心组件,读者可以更好地掌握Spring Bean的管理和控制机制。
1908 1
|
存储 Java 数据库连接
【Spring传播机制底层原理】
【Spring传播机制底层原理】
434 0
|
XML 缓存 Java
【spring源码系列-02】通过refresh方法剖析IOC的整体流程
【spring源码系列-02】通过refresh方法剖析IOC的整体流程
392 0
|
存储 缓存 安全
Spring JDBC-Spring事务管理之ThreadLocal基础知识
Spring JDBC-Spring事务管理之ThreadLocal基础知识
432 0

热门文章

最新文章