HashMap理解

news2025/1/12 21:49:17

简单介绍

HashMap是双列集合Map接口下的实现类,jdk1.8之前其数据结构是数组+链表、jdk1.8之后是数组+链表+红黑树,是线程不安全的,
在这里插入图片描述原理图:
在这里插入图片描述
HashMap放值的过程
HashMap先是根据Hash算法算出key的hashcode码值,存储对象为 Map.Entry,entry 对象包含四个信息,key、value、hash 值、 链表地址值,因为存储元素时,会根据 hash 值%16 计算元素存储数组中的索引位置,找到对应的数组索引下标,如果当前索引没有存放链表entry实体,则将当前链表存放进去,如果已经存放了一个具有相同hashcode码值的链表,这就发生了Hash碰撞,即两个元素不相同,却有一样的 hash 值,HashMap采用的是拉链法解决hash碰撞的,将元素在数组中存入链表中,以链表的形式进行元素的存储,第一个 entry 存在链表顶端,再有 hash 值一致的 entry 存入,则链接在第一个元素之后,在jdk8以后对链表进行了改进,当链表长度大于8的时候会转化成红黑树,而红黑树的数量小于6是会自动转化为链表。
HashMap取值的过程
根据传进来的key对其进行Hash算法获取hashcode值,找到对应的数组索引下标,如果当前索引直接命中则返回value值,如果发生Hash碰撞,因为重写了equals方法其真实的每一个key值都是唯一的,则通过重写的key.equals(k)去查找具体的entry实体,直到找到返回其value值。

HashMap中几个重要的属性:

在这里插入图片描述
在这里插入图片描述

重要名词

Hash算法:Hash 算法是一个广义的算法,也可以认为是一种思想,使用Hash算法可以提高存储空间的利用率和数据的查询效率。哈希(Hash)也称为散列,就是把任意长度的输入,通过 Hash 算法,变换成固定长度的输出,这个输出值就是散列值
Hash碰撞: hash算法是把任意长度的较长字符串变成固定长度的较短字符串,肯定会存在若干个key通过hash算法得到的hash值是完全相同的,这就叫hash碰撞。

面试问题

1、一问

  • 你看过HashMap源码吗,知道底层的原理吗
  • 为什么使用数组+链表
  • 用LinkedList代替数组可以吗
  • 既然是可以的,为什么不用反而用数组

2、二问

  • 知道HashMap的put元素的过程是什么样吗?
  • 知道get过程是是什么样吗?
  • 你还知道哪些的hash算法?
  • 说一说String的hashcode的实现

3、三问

  • 知道jdk1.8中hashmap改了什么吗。
  • 说一下为什么会出现线程的不安全性
  • 为什么在解决hash冲突时候,不直接用红黑树,而是先用链表,再用红黑树
  • 当链表转为红黑树,什么时候退化为链表

4、四问

  • HashMap在并发环境下会有什么问题
  • 一般是如何解决的

5、五问

  • key可以是null吗,value可以是null吗
  • 一般用什么作为key值
  • 用可变类当Hashmap1的Key会有什么问题
  • 让你实现一个自定义的class作为HashMap的Key该如何实现

参考博客:
看完还不懂HashMap算我输

HashMap底层实现原理/HashMap与HashTable区别/HashMap与HashSet区别
通俗解释hash碰撞是什么以及如何解决

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/436080.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Vivado之VIO原理及应用

虚拟输入输出(Virtual Input Output,VIO)核是一个可定制的IP核,它可用于实时监视和驱动内部FPGA的信号,如图所示。 可以定制VIO的输入和输出端口的数量与宽度,用于和FPGA设计进行连接。由于VIO核与被监视和驱动的设计同步&#xf…

Linux操作系统原理—内核网络协议栈

前言 本文主要记录 Linux 内核网络协议栈的运行原理 数据报文的封装与分用 封装:当应用程序用 TCP 协议传送数据时,数据首先进入内核网络协议栈中,然后逐一通过 TCP/IP 协议族的每层直到被当作一串比特流送入网络。对于每一层而言&#xff…

SwiftUI 使用 UIPageViewController 翻页后出现空白的原因及解决

问题现象 我们 SwiftUI 开发的 App 需要 UIPageViewController 的翻页功能,这可以非常方便的通过桥接 UIKit 到 SwiftUI 来搞定: 不过,观察上图可以发现 App 翻页显示的并不太对:当用户通过右下角的 UIPageControl 触发翻页时没有问题,但当用户直接手动在 UIPageViewCont…

【毕业设计】基于程序化生成和音频检测的生态仿真与3D内容生成系统----音频检测算法设计

(2条消息) 【开发日志】2022.09.02 ZENO----Audio----Beat detection algorithm----Combine Wav&Mp3_minimp3 和 ffmpeg_EndlessDaydream的博客-CSDN博客https://blog.csdn.net/Angelloveyatou/article/details/126670613 4 音频检测算法设计 4.1 节拍检测算法 4.1.1 节…

JavaSE——数组

这篇文章的面向读者为Java初级程序员,也就是刚刚接触到Java这门语言,里面描述的内容主要是数组相关的内容,讲解了最基础的一些数组扩容思路,数组赋值机制,什么是引用地址,什么是基础数据赋值。 Java该章节数…

JAVA入坑之线程

目录 一、:相关概念 1.1中央处理器(CPU,Central Processing Unit) 1.2程序、进程、线程 1.3线程与任务 二、线程的创建: 2.1继承Thread创建线程: 使用Thread子类创建线程的优缺点 2.2实现Runnable接口创建线程:…

【C++STL精讲】list的使用教程及其模拟实现

文章目录 💐专栏导读💐文章导读🌷list是什么?🌷list如何使用?🌷list的模拟实现🌺定义list类🌺构造函数🌺push_back🌺pop_back 🌷list迭…

利用STM32实现自平衡机器人功能与方法

将机器人整体开源,同时总结一下机器人搭建过程中遇到的坑和未来的改进方向。在分享的文件里包含了结构设计、程序控制、电路设计以及其他模块相关资料供大家参考。 第一:机器人原理分析 首先来看成品图: 如图所示,该机器人根据陀…

宝塔面板设置虚拟内存Swap降低的方法

宝塔面板可以通过设置Swap/虚拟内存的方式来降低内存使用率和负载,使用宝塔面板的Linux工具箱即可设置虚拟内存,新手站长来详细说下宝塔Linux面板设置Swap/虚拟内存的方法: 宝塔面板设置虚拟内存 设置虚拟内存是通过Linux工具箱&#xff0c…

4.0、Java继承与多态 - 抽象类与抽象方法

4.0、Java继承与多态 - 抽象类与抽象方法 先给大家举个例子 -> 创建一个父类 - 图形类;图形类中有一个计算面积的方法 calculateArea(); 创建三个子类 - 正方形、三角形、圆形 类; 由于我们图形类父类中未明确指明是什么图形&#xff0c…

内网域环境搭建学习

建立的关系就是这样,接下来就开始讲解遇到的困难 虚拟机中我们可以克隆来实现域的搭建 可能会出现这样的问题,原因是你的虚拟机没有关闭,所以才会导致这样的原因,解决方法 将虚拟机打开后,电源 -> 关闭客户机&…

MySQL学习笔记第二天

第03章 基本的SELECT语句 1.SQL概述 1.1 SQL背景知识 1946年,世界上第一台电脑诞生,如今,借由这台电脑发展起来的互联网已经自成江湖。在这几十年里,无数的技术、产业在这片江湖里沉浮,有的方兴未艾,有的…

reactxp搭建,start:windows运行不起来

1、官网 reactxp 2、VSCode和Visual Studio2019 安装VSCode Visual Studio 下载地址 先不用勾选工作负荷,直接安装 3、安装nvm 访问下载地址下载安装nvm: 百度云分享 官网直装链接 nvm的github发行界面下载nvm-setup.exe GitCode镜像下载nvm-setup…

ACL配置学习(附练习题)------ensp

从此文了解ACL配置,欢迎学习、指导。 目录 基本ACL配置举例 高级ACL配置举例 ACL配置练习题 定义 访问控制列表ACL(Access Control List)本质上是一种报文过滤器。 范围: OSI七层模型中的网络层、传输层的信息。 滤芯:五…

2023年4月实时获取地图边界数据方法,省市区县街道多级联动【附实时geoJson数据下载】

首先,来看下效果图 在线体验地址:https://geojson.hxkj.vip,并提供实时geoJson数据文件下载 可下载的数据包含省级geojson行政边界数据、市级geojson行政边界数据、区/县级geojson行政边界数据、省市区县街道行政编码四级联动数据&#xff0…

大型医院体检管理系统源码,PEIS体检系统源码 丰富的诊断模板,自动产生小结、综述和建议

PEIS体检管理系统源码 体检条码化管理,体检数据比对,丰富的诊断模板,自动产生小结、综述和建议。 文末获取联系 PEIS体检管理系统对医院体检中心进行系统化和规范化的管理,大大提高体检中心的综合管理水平、工作效率。系统从业务…

设计模式-结构型模式之享元模式

5. 享元模式 5.1. 模式动机 面向对象技术可以很好地解决一些灵活性或可扩展性问题,但在很多情况下需要在系统中增加类和对象的个数。当对象数量太多时,将导致运行代价过高,带来性能下降等问题。 享元模式正是为解决这一类问题而诞生的。享元模…

GoF代理模式

在java中代理模式的作用: 1.一个对象需要受到保护的时候,可以考虑使用代理对象取完成某个行为. 2.需要给某个对象的功能进行功能增强的时候,可以考虑找一个代理进行增强 3.A对象无法和B对象无法直接沟通,也可以使用代理模式解决 代理模式有三…

WPF mvvm框架Stylet使用教程-窗体交互用法

窗体操作 打开窗体 在stylet框架中,要打开一个窗口或者对话框,只需要直接使用窗口管理器 在要使用的ViewModel中注入IWindowManager,然后使用他的方法操作窗口。 ShowDialog(object viewModel)模态显示ShowWindow(object viewModel) 非模…

修改OPNET帮助文档的默认打开浏览器 给Edge浏览器配置IE Tab插件

我在使用 OPENT Modeler 软件时经常会用到帮助文档,但是其默认打开的是 IE 浏览器,想要其在 Edge 浏览器中打开,但是会出现网页无法打开的情况,这时需要给 Edge 浏览器安装一个 IE Tab 插件。 IE Tab 插件是专门针对浏览器而开发的…