2023年Java核心技术面试第五篇(篇篇万字精讲)

news/2025/3/15 22:42:54/

 

目录

十 . HashMap,ConcurrentHashMap源码解析

10.1 HashMap 的源码解析:

10.1.1数据结构:

10.1.2哈希算法:

10.1.3解决哈希冲突:

10.1.4扩容机制:

10.1.5如何使用 HashMap:

10.2  HashMap 关注以下几个方面:

10.2.1 初始容量和负载因子:

10.2.2 put() 方法:

10.2.3 get() 方法:

10.2.4 remove() 方法:

10.2.5 扩容机制:

10.2.6 并发安全性:

10.3  ConcurrentHashMap解析:

 10.3.1 描述:

10.3.2 ConcurrentHashMap 的一些关键特点和实现原理:


十 . HashMap,ConcurrentHashMap源码解析

 

HashMap 是 Java 中常用的散列表(哈希表)实现,它提供了快速的插入、查找和删除操作。

10.1 HashMap 的源码解析:

  1. 10.1.1数据结构:

    • HashMap 内部通过数组和链表(或红黑树)实现。数组被称为桶(bucket),每个桶存储一个链表(或红黑树)的头节点。
    • 每个元素通过哈希值确定它在数组中的位置,具有相同哈希值的元素以链表(或红黑树)的形式存储在同一个桶中。
  2. 10.1.2哈希算法:

    • 在 HashMap 中,通过 key 的 hashCode() 方法获取键的哈希值。
    • 通过哈希值与数组长度取模得到元素在数组中的索引位置。
  3. 10.1.3解决哈希冲突:

    • 当两个不同的 key 对应的哈希值相同时,发生了哈希冲突。
    • HashMap 采用开放寻址法(拉链法)来解决哈希冲突,即将冲突的元素以链表(或红黑树)的形式存储在同一个桶中。
  4. 10.1.4扩容机制:

    • 当 HashMap 中的元素数量超过负载因子乘以数组长度时,会触发扩容操作。
    • 扩容会创建一个更大的数组,并将所有元素重新插入到新的数组中,这个过程可能比较耗时。
  5. 10.1.5如何使用 HashMap:

    • 使用 put(key, value) 方法将键值对存储到 HashMap 中。
    • 使用 get(key) 方法通过键获取对应的值。
    • 使用 remove(key) 方法删除指定键的映射关系。
    • 使用 containsKey(key) 方法检查 HashMap 是否包含指定的键。
    • 迭代 HashMap 可以使用 entrySet() 方法来获取键值对的集合,然后进行遍历操作。

HashMap 在实际开发中被广泛使用,具有高效的插入和查找性能。但需要注意的是,HashMap 不是线程安全的,如果在多线程环境下使用,需要进行适当的同步处理或选择线程安全的替代类(如 ConcurrentHashMap)。

10.2  HashMap 关注以下几个方面:

  1. 10.2.1 初始容量和负载因子:

    • HashMap 的初始容量是指创建 HashMap 时底层数组的大小,默认为 16。
    • 负载因子是指 HashMap 在进行扩容操作之前可以达到的填充比例,默认为 0.75。
    • 当 HashMap 中元素数量达到负载因子乘以当前容量时,会触发扩容操作。
  2. 10.2.2 put() 方法:

    • 当调用 put(key, value) 方法向 HashMap 中插入一个键值对时,首先会计算 key 的哈希值。
    • 然后根据哈希值找到对应的桶(数组索引),如果该桶为空,则直接将键值对插入到桶中。
    • 如果桶不为空,则遍历链表(或红黑树):
      • 如果链表中已存在相同的 key,则更新对应的值。
      • 如果链表中不存在相同的 key,则将新的键值对插入到链表末尾(或红黑树中)。
    • 如果链表长度大于阈值(默认为 8),则将链表转换为红黑树来提高查找效率。
    • 插入完成后,检查是否需要触发扩容操作。
  3. 10.2.3 get() 方法:

    • 当调用 get(key) 方法获取指定 key 对应的值时,首先计算 key 的哈希值。
    • 根据哈希值找到对应的桶,然后遍历链表(或红黑树):
      • 如果链表中存在相同的 key,则返回对应的值。
      • 如果链表中不存在相同的 key,则返回 null。
  4. 10.2.4 remove() 方法:

    • 当调用 remove(key) 方法删除指定 key 对应的键值对时,首先计算 key 的哈希值。
    • 根据哈希值找到对应的桶,然后遍历链表(或红黑树):
      • 如果链表中存在相同的 key,则将该节点从链表(或红黑树)中移除。
      • 如果链表中不存在相同的 key,则不执行任何操作。
  5. 10.2.5 扩容机制:

    • 当 HashMap 中元素数量达到负载因子乘以当前容量时,会触发扩容操作。
    • 扩容会创建一个新的数组,并将所有元素重新插入到新的数组中。
    • 扩容时需要重新计算每个元素在新数组中的位置并重新分配桶。
  6. 10.2.6 并发安全性:

    • HashMap 不是线程安全的,如果在多线程环境下使用,需要进行适当的同步处理或选择线程安全的替代类,如 ConcurrentHashMap。

10.3  ConcurrentHashMap解析:

 10.3.1 描述:

ConcurrentHashMap 是 JDK 提供的线程安全的哈希表实现,它是在多线程环境下使用的一种高效的并发容器。相对于传统的 HashMap,ConcurrentHashMap 在并发场景下提供了更好的性能和线程安全性。

10.3.2 ConcurrentHashMap 的一些关键特点和实现原理:


http://www.ppmy.cn/news/1045765.html

相关文章

如何在React项目中动态插入HTML内容

React是一种流行的JavaScript库,用于构建用户界面。它提供了一种声明式的方法来创建可复用的组件,使得开发者能够更轻松地构建交互性的Web应用程序。在React中,我们通常使用JSX语法来描述组件的结构和行为。 在某些情况下,我们可…

使用IText导出复杂pdf

1、问题描述 需要将发票导出成pdf&#xff0c;要求每页都必须包含发票信息和表头行。 2、解决方法 使用IText工具实现PDF导出 IText8文档&#xff1a;Examples (itextpdf.com) 3、我的代码 引入Itext依赖&#xff0c;我这里用的是8.0.1版本 <dependency><groupId>…

【李沐】3.2线性回归从0开始实现

%matplotlib inline import random import torch from d2l import torch as d2l1、生成数据集&#xff1a; 看最后的效果&#xff0c;用正态分布弄了一些噪音 上面这个具体实现可以看书&#xff0c;又想了想还是上代码把&#xff1a; 按照上面生成噪声&#xff0c;其中最后那…

数字化车间mes生产执行管理系统

数字化车间mes是一款基于B/S结构的生产执行管理系统&#xff0c;主要目的是为中小企业提供了高效率、低成本、通用性强的一个MES系统解决方案&#xff0c;能够实时监控当前完成进度。 功能简介&#xff1a; 生产管理 大屏展示&#xff1a;可以从大屏展示页面看到任工序…

(202308)科研论文配图 task1 书籍第一章阅读

《科研论文配图绘制指南——基于python》阅读笔记 第一章阅读笔记 《科研论文配图绘制指南——基于python》阅读笔记序言阅读笔记1.1 绘制基础绘制原则 1.2 配色基础1.2.1 色彩格式1.2.2 色轮配色原理1.2.3 颜色主题1.2.4 配色工具 序言 有幸在这次的组队学习活动中&#xff0…

react之react-redux的介绍、基本使用、获取状态、分发动作、数据流、reducer的分离与合并等

react之react-redux的介绍、基本使用、获取状态、分发动作、数据流、reducer的分离与合并等 一、react-redux介绍二、React-Redux-基本使用三、获取状态useSelector四、分发动作useDispatch五、 Redux 数据流六、代码结构七、ActionType的使用八、Reducer的分离与合并九、购物挣…

ui设计需要学编程吗难不难学习 优漫动游

ui设计需要学编程吗难不难学习&#xff0c;对于基础小白来说学习编程确实有一定难度&#xff0c;所以很想知道零基础学习ui设计需要学编程吗&#xff0c;需不需要写代码呢&#xff0c;这些问题小编来简单的分析分析解决零基础小白的一些困惑&#xff0c;希望对你有帮助。 ui…

我和 TiDB 的故事 | 远近高低各不同

作者&#xff1a; ShawnYan 原文来源&#xff1a; https://tidb.net/blog/b41a02e6 Hi, TiDB, Again! 书接上回&#xff0c; 《我和 TiDB 的故事 | 横看成岭侧成峰》 &#xff0c;一年时光如白驹过隙&#xff0c;这一年我好似在 TiDB 上投入的时间总量不是很多&#xff0…