java中Map常见的面试问题,扩容问题,转红黑树的前提,解决Hash哈希冲突的方法

Map集合常见面试题

如何解决

解决哈希碰撞的方法
1链地址法(hashMap的处理方式)

        把hash表的每个单元作为链表的头节点。当发生冲突时放入到同一个hash值计算索引对应的链表。

2开放定址法

        发生冲突后寻找下一个地址

3再次hash法

        对hash值再次进行hash计算

4建立公共溢出区

        把hash表分为基本表和溢出表,当溢出时放入到溢出表;

问1:存储在Node中的hash值,是否就是key的hashCode()?

答:不是,存储在Node中的hash值是先对key进行hashCode()进行计算,然后再无符号右位移16,再按位异或的结果。

static final int hash(Object key) {

  int h;

  //hashCode和右移16进行按位异或运算

  return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);

}

问2:如何知道一个节点到底存储在Hash表(散列表)的哪个位置?

答:通过计算一个节点的key的hashCode()值(不是简单的进行hashCode),

(数组长度-1) & hash(hash%数组长度)计算的结果得出具体的下标,如果在索引位置只有一个节点直接返回,非一个节点继续在链表或红黑树中查找。

问3:什么时候需要把链表转为红黑树?

答:索引处链表的节点数大于8(从0开始的, 多以判断条件为 >=7), 数组的长度必须大于等于64,这个时候就会转成红黑树 要么就会数组的扩容。

问4:什么时候扩容?

答:情况一:

HashMap的Size(表中记录数)达到Hash中数组长度*loadFactor(扩容因子)时扩容。即比threshold大, 进行扩容。每次扩容为原数组长度的一倍(<< 1)

情况二:

Hash表中某个链表长度到达8,且Hash表中数组的长度小于64.

问5:Hash表中数组最大长度为多少?

答案:最大长度为 1<<30. 即:2的30次方法。

计算操作时,发现Hash表中数组长度为2的倍数效率最高,需要一直保持长度为2的倍数。数组长度最大取值为2的31次方减一。所以里面最大的2的倍数为2的30次方。

问6:Hash表中使用的是单向链表还是双向链表?数组扩容时, 链表使用的是尾加还是头加?

答1:单项链表

答2:JDK1.8及之后尾插法  JDK1.7及以前采用的是头插法;

问7:链表转为红黑树时,数组中是所有的链表都转为红黑树,还是什么情况?

答案:只有数组里某个下标中的节点个数>8, 并且数组长度>=64, 该下标中的链表转换为红黑树

问8:为什么java8中长度超过8以后将链表变为红黑树?

答案:红黑树的查询效率高于链表

问9:为什么选择8作为转换值?

答:元素个数为8的红黑树中,高度为:4.最多查找4次就能找到需要的的值,长度为8的链表,最多找7次。

例如长度为4就转换。红黑树高度为3,最多找3次。链表最多3次。

例如长度为7就转换。红黑树高度3,最多找3次。链表最多6次。多找3次和转换的性能消耗比较不值得。

在源码上可以看出,在理想状态下,受随机分布的 hashCode 影响,链表中的节点遵循泊松分布,而且根据统计,链表中节点数是 8 的概率已经接近千分之一,而且此时链表的性能已经很差了,所以在这种比较罕见和极端的情况下,才会把链表转变为红黑树

6.10总结:

  1. 从Java8开始HashMap底层由数组+链表+红黑树。
  2. 使用HashMap时,当使用无参构造方法实例化时,设置扩容因子为默认扩容因子(loadFactor)0.75。
  3. 当向HashMap添加内容时,会对Key做Hash计算,把得到的Hash值和数组长度-1按位与,计算出存储的位置。
  4. 如果数组中该索引没有内容, 直接存入数组中(Node节点对象), 该下标中有Node对象了, 把内容添加到对应的链表或红黑树中。
  5. 如果添加后链表长度大于等于8,会判断数组的长度是否大于等于64,如果小于64对数组扩容,扩容长度为原长度的2倍,扩容后把原Hash表内容重新放入到新的Hash表中。如果Hash长度大于等于64会把链表转换红黑树。
  6. 最终判断HashMap中元素个数是否已经达到扩容值(threshold),如果达到扩容值,需要进行扩容,扩容一倍。
  7. 反之,如果删除元素后,红黑树的元素个数小于等于6,由红黑树转换为链表。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SQL server中:常见问题汇总(如:修改表时不允许修改表结构、将截断字符串或二进制数据等)

SQL server中&#xff1a;常见问题汇总 1.修改表时提示&#xff1a;不允许修改表结构步骤图例注意 2.将截断字符串或二进制数据。3.在将 varchar 值 null 转换成数据类型 int 时失败。4.插入insert 、更新update、删除drop数据失败&#xff0c;主外键FOREIGN KEY 冲突5.列不允许…

企业微信接入芋道SpringBoot项目

背景&#xff1a;使用芋道框架编写了一个数据看板功能需要嵌入到企业微信中&#xff0c;方便各级人员实时观看 接入企业微信的话肯定不能像平常pc端一样先登录再根据权限看页面&#xff0c;不然的话不如直接手机浏览器打开登录账号来得更为方便&#xff0c;所以迎面而来面临两…

如何使用PHPicker在iOS系统无授权下获取资源

本文字数&#xff1a;2766字 预计阅读时间&#xff1a;18分钟 自iOS14系统开始&#xff0c;苹果加强了用户隐私和安全功能。新增了“Limited Photo Library Access”模式&#xff0c;同时在授权弹窗中增加了“Select Photo”选项。这意味着用户可以在应用程序请求访问相册时选择…

网络协议--TCP连接的建立与终止

18.1 引言 TCP是一个面向连接的协议。无论哪一方向另一方发送数据之前&#xff0c;都必须先在双方之间建立一条连接。本章将详细讨论一个TCP连接是如何建立的以及通信结束后是如何终止的。 这种两端间连接的建立与无连接协议如UDP不同。我们在第11章看到一端使用UDP向另一端发…

Spring Boot进阶(94):从入门到精通:Spring Boot和Prometheus监控系统的完美结合

&#x1f4e3;前言 随着云原生技术的发展&#xff0c;监控和度量也成为了不可或缺的一部分。Prometheus 是一款最近比较流行的开源时间序列数据库&#xff0c;同时也是一种监控方案。它具有极其灵活的查询语言、自身的数据采集和存储机制以及易于集成的特点。而 Spring Boot 是…

使用Python将PDF转为图片

将PDF转为图片能方便我们将文档内容上传至社交媒体平台进行分享。此外&#xff0c;转换为图片后&#xff0c;还可以对图像进行进一步的裁剪、调整大小或添加标记等操作。 用Python将PDF文件转JPG/ PNG图片可能是大家在一些项目中会遇到的需求&#xff0c;下面将详细介绍如何使用…

JAVA:集合框架常见的面试题和答案

1、List接口的常见实现类有哪些&#xff1f; 答&#xff1a; 常见的List接口实现类包括&#xff1a; ArrayList: 基于动态数组实现的List&#xff0c;支持快速随机访问。LinkedList: 基于链表实现的List&#xff0c;支持快速的插入和删除操作。Vector: 一个线程安全的动态数组…

【开源】基于SpringBoot的天然气工程业务管理系统的设计和实现

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、使用角色3.1 施工人员3.2 管理员 四、数据库设计4.1 用户表4.2 分公司表4.3 角色表4.4 数据字典表4.5 工程项目表4.6 使用材料表4.7 使用材料领用表4.8 整体E-R图 五、系统展示六、核心代码6.1 查询工程项目6.2 工程物资…

泛积木-低代码 使用攻略

文档首发于 泛积木-低代码 使用攻略 我们以大纲的方式&#xff08;总体把握&#xff09;讲述如何高效、便捷使用 泛积木-低代码。 权限 首先说下权限&#xff0c;在 系统设置 / 权限设置 菜单内&#xff0c;我们可以新增调整项目内的权限&#xff0c;默认拥有管理员和成员两…

Python数据挖掘:入门、进阶与实用案例分析——基于非侵入式负荷检测与分解的电力数据挖掘

文章目录 摘要01 案例背景02 分析目标03 分析过程04 数据准备05 属性构造06 模型训练07 性能度量08 推荐阅读赠书活动 摘要 本案例将根据已收集到的电力数据&#xff0c;深度挖掘各电力设备的电流、电压和功率等情况&#xff0c;分析各电力设备的实际用电量&#xff0c;进而为电…

仓库管理系统源代码集合,带图片展示和网站演示

目录 1、ModernWMS2、GreaterWMS3、kopSoftWMS4、SwebWMS5、若依wms6、jeewms 1、ModernWMS 体验地址&#xff1a;https://wmsonline.ikeyly.com 简易完整的仓库管理系统 该库存管理系统是&#xff0c;我们从多年ERP系统研发中总结出来的一套针对小型物流仓储供应链流程。 简…

《C和指针》笔记34:字符串函数

文章目录 1. 获取字符串长度strlen 2. 复制字符串strcpystrncpy 3. 拼接字符串strcatstrncat 4. 字符串比较strcmpstrncmp 5. 查找字符strchr和strrchr&#xff1a;查找一个字符strpbrk&#xff1a;查找任何几个字符strstr&#xff1a;查找一个子串strspn和strcspn&#xff1a;…

Nginx的进程结构实例演示

可以参考《Ubuntu 20.04使用源码安装nginx 1.14.0》安装nginx 1.14.0。 nginx.conf文件中worker_processes 2;这条语句表明启动两个worker进程。 sudo /nginx/sbin/nginx -c /nginx/conf/nginx.conf开启nginx。 ps -ef | grep nginx看一下进程情况。 sudo /nginx/sbin/ng…

Mathtype使用指南01:下载与安装

目录 介绍&#xff1a; 安装 介绍&#xff1a; MathType 是一款广泛用于数学和科学文档创建的强大数学编辑工具。它允许用户轻松地在各种文档类型中插入数学方程、符号和公式&#xff0c;是学术界、工程领域、出版界和教育机构中的专业人士常用的工具。下面是关于 MathType 的…

设计模式:桥接模式(C#、JAVA、JavaScript、C++、Python、Go、PHP)

上一篇《适配器模式》 下一篇《装饰器模式》 简介&#xff1a; 桥接模式&#xff0c;它是一种结构型设计模式&#xff0c;它的主要目的是将抽象部分与具体实现部分分离&#xff0c;使它们都可以独立地变化。…

SQL server 代理服务启动和查看

设置重启 使用管理员权限登录到运行 SQL Server 代理服务的计算机。 打开 Windows 服务管理器。可以通过按下 Windows 键 R&#xff0c;然后键入 "services.msc" 并按 Enter 来打开服务管理器。 在服务列表中&#xff0c;找到 "SQL Server Agent" 服务&…

网络协议--TFTP:简单文件传送协议

15.1 引言 TFTP(Trivial File Transfer Protocol)即简单文件传送协议&#xff0c;最初打算用于引导无盘系统&#xff08;通常是工作站或X终端&#xff09;。和将在第27章介绍的使用TCP的文件传送协议&#xff08;FTP&#xff09;不同&#xff0c;为了保持简单和短小&#xff0…

无需更换vue-cli 脚手架 uniapp-搭建项目-H5-低版本安卓IOS兼容问题(白屏)(接口请求异常)

✨求关注~ &#x1f4bb;博客&#xff1a;www.protaos.com I. 简介 A. UniApp项目概述 B. 白屏和接口请求异常问题的背景 II. 白屏问题 A. 问题描述 1、uniapp 打包H5内嵌入APP内、低版本手机系统访问白屏问题 B. 问题根本原因 1、低版本手机系统 自带的webview内核不支持ES6语…

Java练习题2020-4

小明今天收了N个鸡蛋&#xff0c;每个鸡蛋各有重量&#xff0c;现在小明想找M个重量差距最小的鸡蛋摆成一盒出售&#xff0c;输出符合条件的最重一盒鸡蛋的总重量 输入说明&#xff1a;第一行&#xff0c;鸡蛋个数N(N<1000) 每盒个数M(M<N)&#xff1b;第二行&#xff0…

Jtti:Apache服务的反向代理及负载均衡怎么配置

配置Apache服务的反向代理和负载均衡可以帮助您分散负载并提高应用程序的可用性和性能。下面是一些通用的步骤&#xff0c;以配置Apache反向代理和负载均衡。 1. 安装和配置Apache&#xff1a; 确保您已经安装了Apache HTTP服务器。通常&#xff0c;Apache的配置文件位于/etc…