面试之HashMap
1.什么是集合框架
Java的集合主要有两个根接口Collection和Map派生出来的,Collection派生出来了三个子接口:List,Queue,Set。因此Java集合大致可分为List,Queue,Set,Map四种体系结构。
2.HashMap与TreeMap
HashMap是直接实现Map接口,而TreeMap是实现SortedMap接口的,所以两个还是有不同点。
3.HashSet与TreeSet
4.HashMap的底层数据结构
在jdk1.7和jdk1.8中底层实现是有所区别的。
在jdk1.7中,由“数组 + 链表”组成,数组是HashMap的主体,链表主要为了解决哈希冲突而存在的。
在jdk1.8中,由“数组 + 链表 + 红黑树”组成,当链表过长,会严重影响HashMap的性能,红黑树搜索的时间复杂度为O(logn),而链表为O(n),因此在jdk1.8引入了红黑树,在达到一定条件之后会进行转换:
- 当链表超过8且数据总量超过64才会转红黑树
- 将链表转换成红黑树前会进行判断,如果当前数组的长度小于64,那么会选择先进性扩容,而不是转为红黑树,以减少搜索时间。
5.HashMap插入数据的原理
- 首先根据key值计算哈希值,找到该元素在数组中存储的下标
- 如果数组为空,则首先调用resize初始化数组
- 如果没有哈希冲突,则直接放在对象下标的位置
- 如果冲突了,且key值存在,则直接覆盖掉value值
- 如果冲突之后发现该节点是红黑树,就将这个节点挂在红黑树上
- 如果冲突后是链表,判断该链表是否大于8,如果大于8并且数组容量小于64,就进行扩容;如果链表大于8并且数组容量大于64,则将这个结构转为红黑树;否则,链表插入键值对,如果key存在,就覆盖掉value.
6.Hash初始容量大小的设置以及扩容
6.1初始容量的大小
在new 一个HashMap时候,因为它使用的是懒加载的方式,所以并不会立即初始化数组。而是等到第一次添加元素的时候,才会初始化数组。一般如果不传入参数,初始默认大小为16,负载因子为0.75,但是如果我们传入参数时,并不会按照所传入的参数进行初始化,首先判断所传入的参数是不是2的n次方,如果是则按照所传参数初始化,如果不是2的n次方,那么就会按照大于你设置的那个值但是最接近你设置的那个值的2的n次方进行设置。例如:传入10,不是2的n次方,2^4刚好是大于10且为2的n次方,所以初始化大小为16.
6.2扩容
在什么时候进行扩容呢?
threshold = 容量 * 加载因子。所以当键值对的数量大于threshold时候,此时需要扩容,扩容是是将原来数组扩大2倍,并将原来数组的对象放入到新的数组当中。
7.HashMap和HashTable
HashMap不是线程安全的:
HashMap是map接口的子类,是将键映射到值的对象,其中键和值都是对象,并且不能包含重复键,但可以包含重复值。HashMap允许null key和null value,而hashtable不允许。
HashTable是线程安全。
HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都完成了Map接口,主要区别在于HashMap允许空(null)键值(key),由于非线程安全,效率上可能高于Hashtable。
最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在多个线程访问Hashtable时,不需要自己为它的方法实现同步,而HashMap 就必须为之提供外同步。 Hashtable和HashMap采用的hash/rehash算法都大概一样,所以性能不会有很大的差。
8.ConcurrentHashMap
虽然jdk提供了HashMap和HashTable但是如何同时满足线程安全和效率高呢,显然这两个都无法满足,所以就诞生了ConcurrentHashMap神器,让我们应用于高并发场景。
该神器采用了分段锁策略,通过把整个Map分成N个Segment(类似HashTable),可以提供相同的线程安全,效率提升N倍,默认提升16倍。ConcurrentHashMap的优点就是HashMap和HashTable的缺点,当然该神器也是不支持键值为null的
9.解决hash冲突的方法有哪些,HashMap用的哪种方法
解决hash冲突的方法有:开放定址法,再哈希法,链地址法,建立公共溢出区,HashMap采用的是链地址法。
- 开放定址法:也称为再散列法,基本思想就是,如果p = H(key)出现冲突时,则以p为基础,再次hash,p1 = H(p),如果p1再次冲突,则以p1为基础,以此类推,直到找到一个不冲突的哈希地址。因此开放定址法所需要的hash表长度大于等于所需要存放的元素。
- 再哈希法:称为双重散列或者多重散列,提供多个不同的hash函数,p1 = H1(key)发生冲突时,再使用不同的哈希函数计算p2 = H2(key),直到没有冲突位置。此方法虽然不会产生堆积,但是计算时间比较长
- 链地址法:将hash值相同的额元素构成一个单链表,并将单链表的头指针放在哈希表的第i个单元,查找,插入和删除主要在链表中进行。适用于频繁的插入和删除
- 建立公共溢出区:将哈希表分为公共表和溢出表,当发生溢出时,所有的溢出数据放在溢出表
10.一般用什么作为HashMap的key
一般使用Integer,String 这种不可变类型作为HashMap的kay,而且String最为常用。
- 因为字符串是不可变的,所在在它被创建的时候hashcode就已经被缓存了,不需要重新计算,这就是String常用作key的原因
- 因为获取对象的时候要用到equals()和hashcode()方法,那么键对象正确的重写这两个方法非常重要,这些类已经很规范的重写了hashcode()和equals();
11HashMap为什么线程不安全
- 多线程下扩容死循环:在jdk1.7中的HashMap使用头插法插入元素,在多线程的环境下,扩容的时候有可能导致环形链表的出现,形成死循环;因此在jdk1.8中,使用尾插法插入元素,在扩容时候会保持链表元素的原本顺序,不会出现环形链表的问题
- 多线程下put可能导致元素丢失:多线程同时执行put元素时候,如果计算出来的索引值是相同的,那会造成前一个put操作会被后一个put操作所覆盖,从而导致元素的丢失
- put和get并发,可能为空:在线程1执行put操作时候,需要扩容,扩容之后元素拥有了新的位置,导致线程2在执行get操作的时候可能获取为Null值。
相关文章:

面试之HashMap
1.什么是集合框架 Java的集合主要有两个根接口Collection和Map派生出来的,Collection派生出来了三个子接口:List,Queue,Set。因此Java集合大致可分为List,Queue,Set,Map四种体系结构。 2.HashMap与TreeMap HashMap是直接实现Map接口,而Tree…...
promethues mysql-rules
groups: - name: mysql.rules rules: - alert: MysqlDown expr: mysql_up 0 for: 1s labels: severity: critical annotations: title: MySQL down description: "Mysql实例: 【{{ $labels.instance }}】, MySQL instance is down…...

Maven项目中Lifecycle和Plugins下的install的区别
在Maven中,如果你的web和service在不同的模块下,如果直接用用tomcat插件运行web层,那么运行时会报错 Failed to execute goal org.apache.maven.plugins:maven-install-plugin:2.5.2:install (default-cli) on project springboot: The pack…...
02-状态模式
1 意图 允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类。(这里的对象指的就是模型中的Context,行为指的就是State的子类) 2 动机 考虑一个问题:实现一个表示网络连接的类TCPConnection&am…...

Python异常处理中异常的种类有哪些?你知道几个?
前言 嗨喽~大家好呀,这里是魔王呐 ❤ ~! 在python中不同的异常可以用不同的类型(python中统一了类与类别,类型即类)取标识,一个异常标识一种错误。 1.常见语法错误 AttributeError 试图访问一个对象没有的属性&#x…...
COBOL语言介绍及使用场景
COBOL(Common Business-Oriented Language)是一种面向业务的通用计算机编程语言,最初于1959年由美国国家标准学会(ANSI)开发。COBOL的设计目标是为了处理商业应用程序,尤其是大型企业级应用。本文将介绍COB…...

【计算机视觉 | 图像分割】arxiv 计算机视觉关于图像分割的学术速递(8 月 1 日论文合集)
文章目录 一、分割|语义相关(16篇)1.1 DPMix: Mixture of Depth and Point Cloud Video Experts for 4D Action Segmentation1.2 Investigating and Improving Latent Density Segmentation Models for Aleatoric Uncertainty Quantification in Medical Imaging1.3 Domain Ada…...
Jetson nano 安装swapfile 解决Cannot allocate memory 问题
在jetson nano上执行一些程序的时候,由于nano的内存只有4GB,因此可能会出现以下报错信息,例如:OSError:Cannot allocate memory 的问题。可以尝试用下面的方法解决:通过安装 swapfile,可以解决这个问题。 …...

ElasticsSearch基础概念和安装
ElasticSearch基础概念以及可视化界面安装 文章目录 ElasticSearch基础概念以及可视化界面安装1、引言2、基本概念3、倒排索引机制3.1、倒排索引 4、使用docker安装ElasticSearch4.1、下载镜像文件4.2 、创建实例,启动es 5.安装Kibana 1、引言 Elastic 的底层是开源库 Lucene。…...

【GEMM预备工作】行主序和列主序矩阵的内存中的连续性,解决理解问题
在内存存储中,默认矩阵是按照行优先储存的,即矩阵的每一列在内存中是连续的。行优先矩阵储存中行数据是不连续的。 而对于列主序的矩阵,是按照列优先储存的,即矩阵的每一行在内存中是连续的。列优先矩阵储存中列数据是不连续的&am…...

利用el-button 画圆 ,通过border-radius >50% 就成圆形
<el-button type"danger" style"border-radius: 100%; height: 100px;width: 100px;" plain><span style"font-weight: bold;">工艺分析</span></el-button>通过border-radius >50% 就成圆形。 border-radius: 50% …...

在tensorflow分布式训练过程中突然终止(终止)
问题 这是为那些将从服务器接收渐变的员工提供的培训功能,在计算权重和偏差后,将更新的渐变发送到服务器。代码如下: def train():"""Train CIFAR-10 for a number of steps."""g1 tf.Graph()with g1.as_de…...

windows永久暂停更新
目录 1.winr,输入regedit打开注册表 2.打开注册表的这个路径: 计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsUpdate\UX\Settings 右键空白地方新建QWORD值命名为:FlightSettingsMaxPauseDays 3.双击FlightSettingsMaxPauseDays,修改里面的值为100000,右边基数设置…...

Android 9系统源码_音频管理(一)按键音效源码解析
前言 当用户点击Android智能设备的按钮的时候,如果伴随有按键音效的话,会给用户更好的交互体验。本期我们将会结合Android系统源码来具体分析一下控件是如何发出按键音效的。 一、系统加载按键音效资源 1、在TV版的Android智能设备中,我们…...

PyTorch搭建神经网络
PyTorch版本:1.12.1PyTorch官方文档PyTorch中文文档 PyTorch中搭建并训练一个神经网络分为以下几步: 定义神经网络定义损失函数以及优化器训练:反向传播、梯度下降 下面以LeNet-5为例,搭建一个卷积神经网络用于手写数字识别。 …...
TiDB 优雅关闭
背景 今天使用tiup做实验的事后,将tidb节点从2个缩到1个,发现tiup返回成功但是tidb-server进程还在。 这就引发的我的好奇心,why? 实验复现 启动集群 #( 07/31/23 8:32下午 )( happyZBMAC-f298743e3 ):~/docker/tiup/tiproxy…...

食品厂能源管理系统助力节能减排,提升可持续发展
随着全球能源问题的日益突出,食品厂作为能源消耗较大的行业,如何有效管理和利用能源成为了一项重要任务。引入食品厂能源管理系统可以帮助企业实现节能减排,提高能源利用效率,同时也符合可持续发展的理念。 食品厂能源管理系统的…...
ABAP读取文本函数效率优化,read_text --->zread_text
FUNCTION zread_text. *“---------------------------------------------------------------------- "“本地接口: *” IMPORTING *” VALUE(CLIENT) LIKE SY-MANDT DEFAULT SY-MANDT *" VALUE(ID) LIKE THEAD-TDID *" VALUE(LANGUAGE) LIKE THEAD-…...
Spring Data Repository 使用详解
8.1. 核心概念 Spring Data repository 抽象的中心接口是 Repository。它把要管理的 domain 类以及 domain 类的ID类型作为泛型参数。这个接口主要是作为一个标记接口,用来捕捉工作中的类型,并帮助你发现扩展这个接口的接口。 CrudRepository 和 ListCr…...

[ MySQL ] — 数据库环境安装、概念和基本使用
目录 安装MySQL 获取mysql官⽅yum源 安装mysql yum 源 安装mysql服务 启动服务 登录 方法1:获取临时root密码 方法2:无密码 方法3:跳过密码认证 配置my.cnf 卸载环境 设置开机启动(可以不设) 常见问题 安装遇到秘钥过期的问题&…...

铭豹扩展坞 USB转网口 突然无法识别解决方法
当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...

7.4.分块查找
一.分块查找的算法思想: 1.实例: 以上述图片的顺序表为例, 该顺序表的数据元素从整体来看是乱序的,但如果把这些数据元素分成一块一块的小区间, 第一个区间[0,1]索引上的数据元素都是小于等于10的, 第二…...

智慧医疗能源事业线深度画像分析(上)
引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...
MVC 数据库
MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...
css的定位(position)详解:相对定位 绝对定位 固定定位
在 CSS 中,元素的定位通过 position 属性控制,共有 5 种定位模式:static(静态定位)、relative(相对定位)、absolute(绝对定位)、fixed(固定定位)和…...
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...

【JavaWeb】Docker项目部署
引言 之前学习了Linux操作系统的常见命令,在Linux上安装软件,以及如何在Linux上部署一个单体项目,大多数同学都会有相同的感受,那就是麻烦。 核心体现在三点: 命令太多了,记不住 软件安装包名字复杂&…...
基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解
JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用,结合SQLite数据库实现联系人管理功能,并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能,同时可以最小化到系统…...

Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)
Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习) 一、Aspose.PDF 简介二、说明(⚠️仅供学习与研究使用)三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...

【分享】推荐一些办公小工具
1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由:大部分的转换软件需要收费,要么功能不齐全,而开会员又用不了几次浪费钱,借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...