Java中简单易懂的HashMap面试题(面试必备)

这篇文章仅限小编个人的理解,小编不是Java方向的,只是对Java有很高的学习兴趣
如果有什么不对的地方还望大佬指点

HashMap的底层是数组+链表,(很多人应该都知道了)
JDK1.7的是数组+链表
(1.7只是一个例子,以前的话也是这样后面就以1.7为例子了)
首先是一个数组,然后数组的类型是链表
元素是头插法
JDK1.8的是数组+链表 或者 数组+红黑树
首先是一个数组,然后数组的类型是链表
在链表的元素大于8的时候,会变成红黑树
在红黑树的元素小于6的时候会变成链表
元素进行尾插

HaspMap的数组默认大小为16
数组也叫做Hash桶
(貌似听说这个值和阿里巴巴Java开发手册好像有点关系)

HashMap元素的下标是
HashCode(元素) & (数组的长度-1)

HashMap的扩容 Resize

扩容的话,这里有一个值叫做loadFactor(阈值),默认值为0.75;
当数组的 元素数量>数组大小(默认16)* loadFactor(默认0.75)
就会触发扩容,扩容是二倍扩容的 (默认是16扩容后就是32)
这时原来每个元素的下标也会改变的(因为数组的长度变了)
然后就要把每个元素重新分配下标,重新加入链表或者红黑树

HashMap线程不安全
在put的时候,Resize(扩容)会造成数据的覆盖
JDK1.7 因为是头插法,可能会造成循环链表
JDK1.8 是尾插法

使用HashMap怎么才能让他线程安全
使用ConcurrentHashMap,
JDK1.7的是分段数组,有Segment锁(继承于ReentrantLock)加速一小段保证并发
JDK1.8 是和HashMap一样了,数组+链表(或者红黑树)
Synchronized(锁)and CAS(compare and swap)
(JVM在1.6对Synchronize的优化很好)
CAS通俗易懂,比较并替换
(CAS是一种无锁算法,CAS有3个操作数,内存值V,旧的预期值A,要修改的新值B。当且仅当预期值A和内存值V相同时,将内存值V修改为B,否则什么都不做)
(无锁化的修改值的操作,他可以大大降低锁代理的性能消耗。这个算法的基本思想就是不断地去比较当前内存中的变量值与你指定的 一个变量值是否相等,如果相等,则接受你指定的修改的值,否则拒绝你的操作。因为当前线程中的值已经不是最新的值,你的修改很可能会覆盖掉其他线程修改的结果。这一点与乐观锁,SVN的思想是比较类似的)

使用HashTable(基本是废弃的)
HashTable就是把HashMap套上了一个Synchronized

Collections.synchronizedMap()包装
使用synchronized 加上,但是这个是对某个Hash桶(数组的某个值)加锁,并不是整个map加锁,在锁定的时候别的线程也可以进行访问

小编暂时就了解这个多了,有什么遗漏的还望大佬评论

Original: https://www.cnblogs.com/Marcusyang/p/12997447.html
Author: MarcusV
Title: Java中简单易懂的HashMap面试题(面试必备)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/538764/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 《HDFS源码剖析》–初品ing

    HDFS概述 ​ HDFS是Hadoop 分布式文件系统,可以运行在通用硬件上、提供流式数据操作、能够处理超大文件的分布式文件系统。HDFS具有高度容错、高吞吐量、容易扩展、高可靠…

    Java 2023年6月8日
    070
  • Linux网络配置:Nat和桥接模式详解

    Linux网络配置:Nat和桥接模式详解 一、我们首先说一下VMware的几个虚拟设备: Centos虚拟网络编辑器中的虚拟交换机: VMnet0:用于虚拟桥接网络下的虚拟交换机;…

    Java 2023年6月5日
    089
  • 分布式缓存

    1.Redis持久化 Redis有两种持久化方案: RDB持久化 AOF持久化 1.1.RDB持久化 RDB全称Redis Database Backup file(Redis数据…

    Java 2023年6月9日
    078
  • MySQL七:一文详解六大日志

    转载~ 日志一般分为逻辑日志与物理日志两类 「逻辑日志」:即执行过的事务中的sql语句,执行的sql语句(增删改) 「反向」的信息 「物理日志」: mysql 数据最终是保存在数据…

    Java 2023年6月8日
    0100
  • JDBC学习

    笔记如上 学了个代码 php;gutter:true; import java.sql.*;</p> <p>public class jdbc01 { pu…

    Java 2023年6月9日
    088
  • 带你领略下iOS中OC的“alloc”源代码,让你在工作中不在迷惑

    前言前面我们使用官方开源的objc源码进行了编译调试 objc4-818.2源码编译调试笔记 前言为什么会想要调试源码? 苹果开源了部分源码, 但相似内容太多, 基本找不到代码见的…

    Java 2023年6月16日
    074
  • [学习笔记] Java接口

    接口是Java中的一种抽象类型,是抽象方法的集合; 接口使用 interface关键字声明; 接口不是类,它们属于不同的概念,类描述对象的属性和方法,接口则包含要实现的方法; 一个…

    Java 2023年6月5日
    078
  • java多线程如何设置优先级

    从thread类中,我们可以看到类中预先定义了三个优先级。通过getpriority可以看到新建线程的默认等级。 public class ExtendsThread { publ…

    Java 2023年5月29日
    0102
  • java list 按照多字段排序

    list 排序涉及的接口 Comparator, 具体实现代码如下,以Apple类为例 public class Test{  public static void main(St…

    Java 2023年5月29日
    075
  • Springboot 整合 MyBatisPlus[详细过程]

    Springboot 整合 MyBatisPlus[详细过程] 提要 这里已经将Springboot环境创建好 这里只是整合MyBatis过程 引入Maven依赖 添加MyBati…

    Java 2023年6月9日
    076
  • 如何用火焰图进行 Java 性能分析

    Linux下用火焰图进行性能分析(Ubuntu18 操作系统中演示) 软件的性能分析,往往需要查看 CPU 耗时, 了解瓶颈在哪里,而火焰图(flame graph) 是性能分析的…

    Java 2023年5月29日
    062
  • java学习第二天

    Day02 &#x7B2C;&#x4E8C;&#x5929;&#x4E3B;&#x8981;&#x4E86;&#x89E3;…

    Java 2023年6月8日
    062
  • 解决 maven 项目无法编译的问题

    在 idea 中编译时,出现以下错误 代码 Malformed \uxxxx encoding. 经过各种资料和分析后,是因为依赖的 jar 包有下载不完整导致的。解决办法是,把这…

    Java 2023年6月8日
    065
  • 自定义MyBatis

    一. 原生 JDBC 1. 原生JDBC使用 public static void main(String[] args) { Connection conn = null; Pr…

    Java 2023年6月5日
    095
  • 君子不立危墙之下

    君子不立危墙之下 出处 孔子的弟子子路要去卫国做大司马,可是卫国国君无力,太子无德,国内权利交错。孔子不赞成子路去,就说:”危邦不入,乱邦不居,天下有道则入,无道则隐。…

    Java 2023年6月9日
    095
  • 01、springboot 目录

    目录: 主要想把自己的学习成功记录下来,如果看到哪里写的不对,或者不明白都可以留言指正,共同进步 源码 02、SpringBoot 启动 总流程03、SpringBoot 启动 执…

    Java 2023年6月13日
    0116
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球