百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT知识 > 正文

Java面试题专集--HashMap

liuian 2025-05-27 15:53 4 浏览

HashMap的容量为什么是2的幂次

HashMap寻找Index位置是通过位运算计算出来的,但是原理是对length取余数,只有是2的次幂的时候h & (length - 1) == h % length (参数里的h就是key的hashCode,length就是容量capacity)

答:是因为效率,如果length为2的N次方,取模运算可以变成位与运算,效率显著提高!

HashMap原理、红黑树

https://blog.csdn.net/weixin_45093436/article/details/104273595

JDK1.7:哈希表是由数组+链表组成的,因为hashcode相同,所以它们的bucket位置相同,‘碰撞’会发生。因为HashMap使用LinkedList存储对象,这个Entry会存储在LinkedList

jdk1.8引入了红黑树的设计,当冲突的链表长度超过8个时,链表结构就会转为红黑树结构,这样做的好处是避免在极端条件的情况下冲突链表过长而导致查询效率非常慢。

红黑树查询:其访问性能近似于折半查找

红黑树的简单概念 :红黑树是一种近似平衡的二叉查找树,其主要的优点就是平衡,即左右子树高度几乎一致,以此来防止树退化为链表,通过这种方式来保障查找的时间复杂度为log(n);

红黑树的调整方式: https://blog.csdn.net/weixin_45093436/article/details/104273595

HashMap size()方法怎么实现

https://www.jianshu.com/p/88881fdfcf4c

JDK 8 推荐使用mappingCount 方法,因为这个方法的返回值是 long 类型,不会因为 size 方法是 int 类型限制最大值(size 方法是接口定义的,不能修改)。

size 方法调用 sumCount 方法实现,

当 counterCells 是 null,就返返回baseCount , put 结束后会对这个变量做 CAS 加法

当 counterCells 不是 null,就遍历元素,并和 baseCount 累加。

HashMap扩容

我们知道在HashMap的初始化默认容量是16。默认的负载因子大小为0.75

当一个map填满了75%的bucket时候,将会创建原来HashMap大小的两倍的bucket数组,

扩容需要遍历原数组,并且为其中的每个enrty进行hash计算。加入到新数组中,时间复杂度为O(n)。

扩容的成本并不低,最好是创建HashMap指定合适的大小


为啥扩容因子是0.75


选择0.75作为默认的加载因子,完全是时间和空间成本上寻求的一种折衷选择, 0.75的话碰撞最小


HashMap线程不安全


因为多线程环境下,使用Hashmap进行put操作可能会引起死循环,导致CPU利用率接近100%,所以在并发情况下不能使用HashMap

cas是什么?(ConcurrentHashMap)

cas是compareandswap的简称,从字面上理解就是比较并更新,简单来说:从某一内存上取值V,和预期值A进行比较,如果内存值V和预期值A的结果相等,那么我们就把新值B更新到内存,如果不相等,那么就重复上述操作直到成功为止。

它可以解决多线程并发安全的问题,

ConcurrentHashMap

https://www.jianshu.com/p/865c813f2726

在JDK1.7版本中,ConcurrentHashMap的数据结构是由一个Segment数组和多个HashEntry组成, 16个段,Segment数组的意义就是将一个大的table分割成多个小的table来进行加锁,也就是上面的提到的锁分离技术,而每一个Segment元素存储的是HashEntry数组+链表,这个和HashMap的数据存储结构一样

JDK1.8的实现已经抛弃了Segment分段锁机制,利用CAS+Synchronized来保证并发更新的安全。数据结构采用:数组+链表+红黑树。

Java锁的分类

  1. 可重入锁:Synchronized和ReentrantLook都是可重入锁,锁的可重入性标明了锁是针对线程分配方式而不是针对方法。例如调用Synchronized方法A中可以调用Synchronized方法B,而不需要重新申请锁。
  2. 读写锁:按照数据库事务隔离特性的类比读写锁,在访问统一个资源(一个文件)的时候,使用读锁来保证多线程可以同步读取资源。ReadWriteLock是一个读写锁,通过readLock()获取读锁,通过writeLock()获取写锁。
  3. 可中断锁:可中断是指锁是可以被中断的,Synchronized内置锁是不可中断锁,ReentrantLock可以通过lockInterruptibly方法中断显性锁。例如线程B在等待等待线程A释放锁,但是线程B由于等待时间太久,可以主动中断等待锁。
  4. 公平锁:公平锁是指尽量以线程的等待时间先后顺序获取锁,等待时间最久的线程优先获取锁。synchronized隐性锁是非公平锁,它无法保证等待的线程获取锁的顺序,ReentrantLook可以自己控制是否公平锁。

lock和synchronized

https://www.jianshu.com/p/b343a9637f95

Synchronized和Lock比较

  • Synchronized是关键字,内置语言实现,Lock是接口。
  • Synchronized在线程发生异常时会自动释放锁,因此不会发生异常死锁。Lock异常时不会自动释放锁,所以需要在finally中实现释放锁。
  • Lock是可以中断锁,Synchronized是非中断锁,必须等待线程执行完成释放锁。
  • Lock可以使用读锁提高多线程读效率。

常用的RuntimeException

NullPointerException - 空指针引用异常
ClassCastException - 类型强制转换异常。
IllegalArgumentException - 传递非法参数异常。
ArithmeticException - 算术运算异常
IndexOutOfBoundsException - 下标越界异常
NumberFormatException - 数字格式异常
UnsupportedOperationException - 不支持的操作异常

Exception、Error、运行时异常与一般异常有何异同

Error:表示由JVM 所侦测到的无法预期的错误

Exception :表示可恢复的例外,这是可补足的。在程序中必须使用try...catch进行处理。

runtime exception,也叫运行时异常,运行时异常是 Exception 的子类


出现运行时异常后,系统会把异常一直往上层抛,一直遇到处理代码。如果没有处理块,到最上层,如果是多线程就由 Thread.run() 抛出,如果是单线程就被 main() 抛出。抛出之后,如果是线程,这个线程也就推出了。如果主程序抛出的异常,那么这个程序也就退出了。


什么是反射?反射有什么作用?


“反射(Reflection)能够让运行于JVM中的程序检测和修改运行时的行为。”这个概念常常会和内省(Introspection)混淆,以下是这两个术语在Wikipedia中的解释:


  1. 内省用于在运行时检测某个对象的类型和其包含的属性;
  2. 反射用于在运行时检测和修改某个对象的结构及其行为。


反射能够让我们:


  • 在运行时检测对象的类型;
  • 动态构造某个类的对象;
  • 检测类的属性和方法;
  • 任意调用对象的方法;
  • 修改构造函数、方法、属性的可见性;

相关推荐

Firefox火狐浏览器126版更新修复PDF.js漏洞

IT之家5月28日消息,Mozilla基金会在5月14日推出了Firefox火狐浏览器126版本,官方在更新信息中提到该版本主要修复了浏览器内置的PDF组件(PDF.js...

在Web应用中集成 PDF.js: 通过jsdelivr实现动态加载与批注的思考

PDF文档在现代Web应用中越来越常见,无论是作为文档预览、报告展示还是在线编辑的载体。Mozilla的PDF.js是一个功能强大的JavaScript库,它使得在浏览器端渲染和显示...

PDF文件长出“AI大脑”?网友惊呼:这操作太“黑科技”了

你以为PDF只是用来阅读文档的?这次它彻底颠覆了你的想象!极客AidenBai最新整活——直接把大语言模型(LLM)塞进PDF里,打开文件就能让AI讲故事、陪你聊天!更夸张的是,连Linux系统都能...

5种开源PDF解析方案(JS/Node.js)及实战教程

hi,大家好,我是徐小夕.徐小夕【知乎专栏作家】掘金签约作者,定期分享AI创业,可视化,企业实战项目知识,深度复盘企业中经常遇到的500+技术问题解决方案。【关注趣谈前端,技术路上不迷茫】最近一直...

好用的JavaScript客户端PDF插件——jsPDF

介绍和往常一样,jsPDF是一个开源的客户端的PDF解决方案,在之前的文章中已经介绍过几个Web端和PDF相关的库,jsPDF同样是一个不错的客户端PDF引SDK,你可以通过jsPDF在客户端完成相...

为wps增加node.js npm创建wpsjs加载项

选择环境:windows764位版版本:wps官方2019个人版:一。wps安装后,可以选择关闭广告:打开WPSOffice,点击左上角“首页”图标,依次点击右上角“设置”--->“配置...

TypeScript 1.5发布,支持大量ES6新特性

TypeScript1.5正式发布,此版本是VisualStudio2015更新的一部分,可以单独下载VisualStudio2013和npm,或直接从GitHub获得最新版本。值得关注的改...

1.5k+ 开源的高品质音乐命令行下载工具

大家好,我是开源探索者,持续分享开源项目,关注技术的最新动态,分享自己的经验和见解。今天为大家带来一款下载音乐的命令行工具:musicn,基于Node.js开发,可播放和下载高品质的音乐,支持咪...

1天搭建免费微信小程序商店卖茶(3)连载中

前期准备前两篇文章,分别架设好了小程序商站的后台服务端(提供小程序的数据接口,存储商品和交易信息等等),编译并且在手机上成功打开了测试版小程序,成功拉取到了服务器上的测试数据。本篇开始,为“真实”运营...

3200+ Cursor 用户被恶意“劫持”!贪图“便宜 API”却惨遭收割, AI 开发者们要小心了

整理|华卫近日,有网络安全研究人员标记出三个恶意的npm(Node.js包管理器)软件包,这些软件包的攻击目标是一款颇受欢迎的由AI驱动的源代码编辑器Cursor,且针对的是苹果mac...

npm install常见问题

npm编译npminstall叮当问题来了PSD:\wp\project\newPorject\tyzhhw-mysql\code\tyzhhw_sheshi>npminstalln...

微软TypeScript Native预览版发布,带来10倍以上编译性能提升

IT之家5月23日消息,微软首席产品经理丹尼尔罗森瓦瑟(DanielRosenwasser)昨晚发文,宣布TypeScriptNative预览版(最终将演变为TypeScript7...

如何在 Windows 11 或 10 上安装 ASK CLI

ASKCLI是亚马逊为开发人员提供的一个工具,用于创建Alexa技能并随后部署和管理它们。因此,初学者和经验丰富的开发人员都可以通过使用ASKCLI简化开发Alexa技能的任务。所以...

如何将package.json中的每个依赖项更新到最新版本

技术背景在前端开发中,项目的package.json文件管理着项目的依赖信息。随着时间推移,依赖项可能会发布新的版本,包含性能优化、功能增强和安全修复等。因此,将依赖项更新到最新版本对于项目的稳定...

全网最全的 Windows 系统下 Node.js 安装与配置

各位代码江湖的“萌新大侠”们!今天详细介绍windows下node.js的安装与配置,看这篇文章就够了。一、下载安装官网下载:下载|Node.js中文网选择需要下载的版本,这是之前的...