首页 > 编程语言 >Java八股复习指南-集合

Java八股复习指南-集合

时间:2024-09-11 09:51:30浏览次数:8  
标签:八股 Java 复习 数组 链表 键值 哈希 长度 hash

Java集合

Map

HashMap

实现原理/底层

Java1.8之前:数组加链表

Java1.8之后:当一个链表的长度超过8,且数组大小超过64时,会将链表转换成红黑树存储,查找效率更高,时间复杂度O(log n)。如果长度超过8,但是数组容量不足64,则会选择扩容数组。

定位算法

计算key的哈希值,并进行与运算

int index = hash & (table.length - 1);

327b6ce496363ad358efda4838aff0d1

扩容机制

HashMap扩容因子为0.75,当元素个数超过总容量的75%时,则会触发扩容。

主要分为两个步骤:

  1. 对哈希表长度扩展成2倍

  2. 将旧哈希表中的数据放入新的表中

为什么是2倍?如何放入新表?

1713514753772-9467a399-6b18-4a47-89d4-957adcc53cc0

通过将长度进行2次幂扩容,在重新计算hash值时,只需要看新增位是1还是0,是0则索引不变,是1则变成“原索引+oldCap”。这样既节省了重新计算hash的时间,同时也将冲突的节点均匀分散了。

put方法

1720684054342-1e3cb2a9-532e-40b8-b5cf-0043811391dc

  • 根据要添加的键的哈希码计算在数组中的索引
  • 判断对应位置是否有键值对

如果为空,则根据键值对直接创建Entry对象,把该对象存入相应位置。

  • 如果该位置存在其他键值对,检查第一个键值对的哈希码和键是否与要添加的键值对相同(equals()和hashcode())

如果相同,说明添加的是同一个键,使用新值替换旧值,完成更新

  • 如果不相同,则继续遍历链表或红黑树,查找是否有相同的键

如果有相同的值,则使用新值替换旧值,完成更新。

如果没有相同的值,则将新的键值对添加到链表或红黑树。

  • 检查链表长度是否超过阈值(8)

如果链表长度超过8,且数组容量超过64,则会将链表转换成红黑树。

  • 检查负载因子是否超过阈值(0.75)

如果键值对的数量与数组的长度大于阈值,则触发扩容。(链表长度>8,数组容量<64也会触发扩容)

  • 扩容操作

  • 完成添加操作

ConcurrentHashMap

底层实现:

Java1.8之前:底层实现是数组+链表的形式(Segment[]和HashEntry[])

使用分段锁,将整个哈希表分成多个段,每个段都维护自己的哈希表和锁。

Java1.8之后:底层实现是数组+链表/红黑树的形式

主要通过 volatile + CAS 或者 synchronized 来实现的线程安全的。

加锁机制:

分段锁:

将整个数据结构分为多个Segment后,每个Segment都有自己的锁,对不同Segment的操作互不影响,从而提升并发性能。

乐观锁/悲观锁

添加元素时,判断计算的hash是否有元素,如果没元素,则会使用乐观锁CAS,如果发生了hash碰撞则使用悲观锁synchronized。这是因为发生hash碰撞时,大概率是线程竞争比较激烈的时候,使用悲观锁保证线程安全。

标签:八股,Java,复习,数组,链表,键值,哈希,长度,hash
From: https://www.cnblogs.com/forest-pan/p/18407711

相关文章

  • Java八股复习指南-基础
    Java基础接口和抽象类有什么区别?在设计动机上有所有不同接口是自上而下的设计。我们提前设计了一些行为,于是基于这些行为定义一个接口,一些类需要有这些行为,就会实现这个接口。而抽象类是自下而上的设计。当我们写了很多类时,发现他们有很多的共性,于是把这些逻辑抽象出来,减少代......
  • 计算机毕业设计选题推荐-作品分享交流平台(摄影、绘画、书法)-Java/Python项目实战(亮点:
    ✨作者主页:IT毕设梦工厂✨个人简介:曾从事计算机专业培训教学,擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。☑文末获取源码☑精彩专栏推荐⬇⬇⬇Java项目Python项目安卓项目微信小程序项目......
  • 计算机毕业设计选题推荐-企业人事管理系统-Java/Python项目实战
    ✨作者主页:IT毕设梦工厂✨个人简介:曾从事计算机专业培训教学,擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。☑文末获取源码☑精彩专栏推荐⬇⬇⬇Java项目Python项目安卓项目微信小程序项目......
  • 动态规划算法之矩阵链乘法详细解读(附带Java代码解读)
    矩阵链乘法(MatrixChainMultiplication)问题是动态规划中的经典问题之一。该问题的核心目标是在给定的矩阵链中,找到一种最优的乘法顺序,使得计算矩阵乘积的标量乘法次数最小。1.问题描述给定一个矩阵链(A1,A2,...,An),要求计算从第一个矩阵A1​到最后一个矩阵An的乘积A1......
  • RuoYi 开源框架,集成了后端管理,后端java版 App 移动解决方案
    文章目录前言一、后端:二、后台管理三、App移动总结前言后端:后台管理:使用的前端技术Vue、Element后端SpringBoot&Security完全分离的权限管理系统。App移动解决方案:采用uniapp框架提示:以下是本篇文章正文内容,下面案例可供参考一、后端:基于SpringBoot,Sprin......
  • 基于Java Swing的简易人事信息管理系统设计与实现1.0
    目录概述数据库设计创建数据库创建表登录表 land员工信息表 empinfoJava代码实现连接数据库的类 Connect登录界面 Login功能对话框 MyDialog主界面 System运行效果截图:结论 概述在软件开发过程中,利用JavaSwing框架构建图形用户界面(GUI)是一种常见的做......
  • JAVA中的八大排序 可视化精华模板 (思路+代码实践)
    “批判他人总是想的太简单剖析自己总是想的太困难”文章目录前言文章有误敬请斧正不胜感恩!1.冒泡排序(时间复杂度o(n^2))概念步骤可视化代码实现2.选择排序(时间复杂度o(n^2))概念步骤可视化代码实现3.插入排序(时间复杂度o(n^2))概念步骤可视化代码示例4.快速排序(时间......
  • Java SE 语法学习
    JavaSE语法java数据类型基本数据类型整数类型byte占1个字节,范围:-128-127short占2个字节,范围:-32768-32767int占4个字节,范围:-2147483648-2147483647long占8个字节,范围:-9223372036854775808-9223372036854775807浮点数类型double占8个字节float占4个字节字符类......
  • JavaWeb【day12】--(SpringBootWeb登录认证)
    案例-登录认证在前面的课程中,我们已经实现了部门管理、员工管理的基本功能,但是大家会发现,我们并没有登录,就直接访问到了Tlias智能学习辅助系统的后台。这是不安全的,所以我们今天的主题就是登录认证。最终我们要实现的效果就是用户必须登录之后,才可以访问后台系统中的功能。......
  • JavaWeb【day15】--(Maven高级)
    Maven高级Web开发讲解完毕之后,我们再来学习Maven高级。其实在前面的课程当中,我们已经学习了Maven。我们讲到Maven是一款构建和管理Java项目的工具。经过前面10多天web开发的学习,相信大家对于Maven这款工具的基本使用应该没什么问题了。我们掌握了Maven工具的基本......