news 2026/5/19 6:38:32

面试 Java 基础八股文十问十答第十九期

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
面试 Java 基础八股文十问十答第十九期

面试 Java 基础八股文十问十答第十九期

作者:程序员小白条,个人博客

相信看了本文后,对你的面试是有一定帮助的!关注专栏后就能收到持续更新!

⭐点赞⭐收藏⭐不迷路!⭐

1)HashMap的扩容操作是怎么实现的?

HashMap 的扩容操作是在当前容量超过负载因子(默认为 0.75)乘以数组长度(即达到阈值)时触发的。扩容操作会创建一个新的更大的数组,并将原有数组中的元素重新分配到新数组中。具体步骤如下:

  • 创建一个新的数组,其长度是原数组的两倍。
  • 遍历原数组中的每个元素,将它们重新计算哈希值,并根据新数组的长度计算出在新数组中的存储位置。
  • 将元素插入到新数组的对应位置。
  • 扩容完成后,新数组将取代原数组成为 HashMap 的内部存储结构。

2)HashMap是怎么解决哈希冲突的?

HashMap 解决哈希冲突的方法是使用链表(JDK 1.7 及之前)或红黑树(JDK 1.8 及之后)来存储具有相同哈希值的键值对。当发生哈希冲突时,新的键值对会被插入到链表或红黑树的末尾。在查找时,通过比较键的哈希值和键的相等性,可以在链表或红黑树中快速定位到对应的键值对。

3)什么是哈希冲突?

哈希冲突是指不同的键经过哈希函数计算后得到相同的哈希值。由于哈希函数的输出空间一般远小于输入空间,所以在大多数情况下会发生哈希冲突。哈希冲突会导致不同的键值对被存储在数组的同一个位置上,这就需要使用额外的数据结构(如链表或红黑树)来解决冲突,以保证能够正确地存储和检索键值对。解决哈希冲突是哈希表(如 HashMap)实现中的一个重要问题。

4)能否使用任何类作为 Map 的 key?

几乎可以使用任何类作为 Map 的 key,但要注意以下几点:

  • 类必须正确实现hashCode()equals()方法,以确保在哈希表中正确地定位和比较键对象。
  • 不可变类(如 String、Integer)通常是很好的选择,因为它们的哈希值是固定的,且已经正确实现了hashCode()equals()方法。
  • 可变类(如自定义类)作为 key 时,需要特别注意在修改键对象时是否会影响到其哈希值和相等性判断,以避免出现意外的结果。

5)为什么HashMap中String、Integer这样的包装类适合作为K?

String、Integer 这样的包装类适合作为 HashMap 的 key 的原因如下:

  • 这些包装类是不可变的,即创建后不可修改,因此它们的哈希值是固定的,不会因为对象的改变而改变。
  • 这些包装类已经正确地实现了hashCode()equals()方法,确保在哈希表中正确地定位和比较键对象。
  • 这些包装类在 Java 中被广泛使用,具有良好的性能和可靠性。

6)如果使用Object作为HashMap的Key,应该怎么办呢?

如果要使用 Object 类作为 HashMap 的 key,需要注意以下几点:

  • Object 类的hashCode()方法和equals()方法是基于对象的内存地址的,而不是对象的内容。这意味着不同的 Object 对象即使内容相同,它们的哈希值和相等性判断也会不同。
  • 如果要正确使用 Object 类作为 key,需要重写hashCode()equals()方法,以基于对象的内容来计算哈希值和判断相等性。
  • 重写hashCode()equals()方法时,需要确保相等的对象具有相同的哈希值,以便在哈希表中正确地定位和比较键对象。

7)HashMap为什么不直接使用hashCode()处理后的哈希 值直接作为table的下标?

HashMap 不直接使用hashCode()处理后的哈希值作为 table 的下标,是因为哈希值的范围可能超过数组的长度,直接使用哈希值作为下标可能会导致数组越界。因此,HashMap 使用哈希值与数组长度进行位运算,得到在数组中的实际存储位置,保证在数组范围内。

8)HashMap 的长度为什么是2的幂次方

HashMap 的长度选择为2的幂次方是为了提高哈希算法的效率。当 HashMap 的长度为2的幂次方时,通过对哈希值进行位运算,可以用更快的速度计算出元素在数组中的存储位置,减少计算的复杂度。同时,长度为2的幂次方的数组对于哈希值的分布也更加均匀,减少了哈希冲突的可能性。

9)HashMap 与 HashTable 有什么区别?

HashMap 与 HashTable 的区别如下:

  • 线程安全性:HashMap 是非线程安全的,而 HashTable 是线程安全的,内部的方法都进行了同步处理。
  • Null 键和值:HashMap 允许使用 null 作为键和值,而 HashTable 不允许,会抛出 NullPointerException。
  • 迭代器:HashMap 的迭代器是 fail-fast 的,而 HashTable 的迭代器不是。
  • 继承关系:HashMap 继承自 AbstractMap 类,而 HashTable 继承自 Dictionary 类。

10)如何决定使用 HashMap 还是TreeMap?

选择使用 HashMap 还是 TreeMap 取决于需求:

  • 如果需要按键的自然顺序进行遍历或排序,可以选择使用 TreeMap。TreeMap 内部使用红黑树实现,可以保证键的有序性。
  • 如果不需要保持键的顺序,只需要快速的查找、插入和删除操作,可以选择使用 HashMap。HashMap 内部使用哈希表实现,具有更高的插入和查找效率。
  • 另外,如果需要在多线程环境下使用,可以考虑使用 ConcurrentHashMap,它是线程安全的 HashMap 实现。

前后端项目 Gitee & Github 累计 3000+ Star,10W+浏览量!⭐点赞⭐收藏⭐不迷路!⭐

智能 AI 旅游推荐平台:https://github.com/luoye6/vue3_tourism_frontend

智能 AI 校园二手交易平台:https://github.com/luoye6/vue3_trade_frontend

GPT 智能图书馆:https://github.com/luoye6/Vue_BookManageSystem

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/11 20:39:17

游戏测试和软件测试有什么区别?

针对手游而言,游戏测试的本质是APP,所以不少手游的测试方式与APP测试异曲同工,然而也有所不同。APP更多的是具有一种工具,一款APP好不好用不重要,关键点在于实用。而游戏则具有一种玩具属性,它并不见得实用…

作者头像 李华
网站建设 2026/5/15 15:27:12

深度收藏:RAG架构革命 - 解决大模型幻觉与知识瓶颈的终极方案

本文剖析了大模型幻觉与知识瓶颈的根源,提出RAG技术通过架构层面的解耦,将外部知识检索与生成模型分离,构建动态知识架构。RAG系统通过分层设计,实现基于外部证据的生成约束、低成本知识更新和结果可验证性,从根本上解…

作者头像 李华
网站建设 2026/5/13 6:37:29

【基于STFT-CNN-SVM的故障诊断】一种融合短时傅里叶变换(STFT)、卷积神经网络(CNN)和支持向量机(SVM)的故障诊断研究附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。 🍎 往期回顾关注个人主页:Matlab科研工作室 🍊个人信条:格物致知,完整Matlab代码及仿真…

作者头像 李华
网站建设 2026/5/14 12:13:49

Github 标星 60K,不愧是阿里巴巴内部出厂的“Java 核心面试神技”

前言 作为一个 Java 程序员,你平时总是陷在业务开发里,每天噼里啪啦忙敲着代码,上到系统开发,下到 Bug 修改,你感觉自己无所不能。然而偶尔的一次聚会,你听说和自己一起出道的同学早已经年薪 50 万&#x…

作者头像 李华
网站建设 2026/5/13 19:47:34

时代转型与企业重生:新政策背景下的专精特新企业破局之道

时代转型与企业重生:新政策背景下的专精特新企业破局之道 在产业变革的宏大叙事中,《优质中小企业梯度培育管理办法》的发布标志着中国产业政策的历史性转折。这份文件表面上是规范管理,实质上是发展范式的系统性重构——它不再满足于培育一…

作者头像 李华