当前位置: 首页 > news >正文

面试之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插入数据的原理

  1. 首先根据key值计算哈希值,找到该元素在数组中存储的下标
  2. 如果数组为空,则首先调用resize初始化数组
  3.  如果没有哈希冲突,则直接放在对象下标的位置
  4. 如果冲突了,且key值存在,则直接覆盖掉value值
  5. 如果冲突之后发现该节点是红黑树,就将这个节点挂在红黑树上
  6. 如果冲突后是链表,判断该链表是否大于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分布式训练过程中突然终止(终止)

问题 这是为那些将从服务器接收渐变的员工提供的培训功能&#xff0c;在计算权重和偏差后&#xff0c;将更新的渐变发送到服务器。代码如下&#xff1a; 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智能设备的按钮的时候&#xff0c;如果伴随有按键音效的话&#xff0c;会给用户更好的交互体验。本期我们将会结合Android系统源码来具体分析一下控件是如何发出按键音效的。 一、系统加载按键音效资源 1、在TV版的Android智能设备中&#xff0c;我们…...

PyTorch搭建神经网络

PyTorch版本&#xff1a;1.12.1PyTorch官方文档PyTorch中文文档 PyTorch中搭建并训练一个神经网络分为以下几步&#xff1a; 定义神经网络定义损失函数以及优化器训练&#xff1a;反向传播、梯度下降 下面以LeNet-5为例&#xff0c;搭建一个卷积神经网络用于手写数字识别。 …...

TiDB 优雅关闭

背景 今天使用tiup做实验的事后&#xff0c;将tidb节点从2个缩到1个&#xff0c;发现tiup返回成功但是tidb-server进程还在。 这就引发的我的好奇心&#xff0c;why&#xff1f; 实验复现 启动集群 #( 07/31/23 8:32下午 )( happyZBMAC-f298743e3 ):~/docker/tiup/tiproxy…...

食品厂能源管理系统助力节能减排,提升可持续发展

随着全球能源问题的日益突出&#xff0c;食品厂作为能源消耗较大的行业&#xff0c;如何有效管理和利用能源成为了一项重要任务。引入食品厂能源管理系统可以帮助企业实现节能减排&#xff0c;提高能源利用效率&#xff0c;同时也符合可持续发展的理念。 食品厂能源管理系统的…...

ABAP读取文本函数效率优化,read_text --->zread_text

FUNCTION zread_text. *“---------------------------------------------------------------------- "“本地接口&#xff1a; *” 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类型作为泛型参数。这个接口主要是作为一个标记接口&#xff0c;用来捕捉工作中的类型&#xff0c;并帮助你发现扩展这个接口的接口。 CrudRepository 和 ListCr…...

[ MySQL ] — 数据库环境安装、概念和基本使用

目录 安装MySQL 获取mysql官⽅yum源 安装mysql yum 源 安装mysql服务 启动服务 登录 方法1&#xff1a;获取临时root密码 方法2&#xff1a;无密码 方法3&#xff1a;跳过密码认证 配置my.cnf 卸载环境 设置开机启动(可以不设) 常见问题 安装遇到秘钥过期的问题&…...

conda相比python好处

Conda 作为 Python 的环境和包管理工具&#xff0c;相比原生 Python 生态&#xff08;如 pip 虚拟环境&#xff09;有许多独特优势&#xff0c;尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处&#xff1a; 一、一站式环境管理&#xff1a…...

vscode里如何用git

打开vs终端执行如下&#xff1a; 1 初始化 Git 仓库&#xff08;如果尚未初始化&#xff09; git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...

树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频

使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...

R语言AI模型部署方案:精准离线运行详解

R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...

Spring Boot 实现流式响应(兼容 2.7.x)

在实际开发中&#xff0c;我们可能会遇到一些流式数据处理的场景&#xff0c;比如接收来自上游接口的 Server-Sent Events&#xff08;SSE&#xff09; 或 流式 JSON 内容&#xff0c;并将其原样中转给前端页面或客户端。这种情况下&#xff0c;传统的 RestTemplate 缓存机制会…...

定时器任务——若依源码分析

分析util包下面的工具类schedule utils&#xff1a; ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类&#xff0c;封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz&#xff0c;先构建任务的 JobD…...

Robots.txt 文件

什么是robots.txt&#xff1f; robots.txt 是一个位于网站根目录下的文本文件&#xff08;如&#xff1a;https://example.com/robots.txt&#xff09;&#xff0c;它用于指导网络爬虫&#xff08;如搜索引擎的蜘蛛程序&#xff09;如何抓取该网站的内容。这个文件遵循 Robots…...

Linux-07 ubuntu 的 chrome 启动不了

文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了&#xff0c;报错如下四、启动不了&#xff0c;解决如下 总结 问题原因 在应用中可以看到chrome&#xff0c;但是打不开(说明&#xff1a;原来的ubuntu系统出问题了&#xff0c;这个是备用的硬盘&a…...

MySQL 8.0 OCP 英文题库解析(十三)

Oracle 为庆祝 MySQL 30 周年&#xff0c;截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始&#xff0c;将英文题库免费公布出来&#xff0c;并进行解析&#xff0c;帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...

Map相关知识

数据结构 二叉树 二叉树&#xff0c;顾名思义&#xff0c;每个节点最多有两个“叉”&#xff0c;也就是两个子节点&#xff0c;分别是左子 节点和右子节点。不过&#xff0c;二叉树并不要求每个节点都有两个子节点&#xff0c;有的节点只 有左子节点&#xff0c;有的节点只有…...