news 2026/5/8 13:53:36

面试 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/5 22:56:27

英文文献研读与分析:关键要点提炼及应用研究

做科研的第一道坎,往往不是做实验,也不是写论文,而是——找文献。 很多新手科研小白会陷入一个怪圈:在知网、Google Scholar 上不断换关键词,结果要么信息过载,要么完全抓不到重点。今天分享几个长期使用的…

作者头像 李华
网站建设 2026/5/5 22:56:26

收藏!2026 AI应用开发工程师高薪指南:普通人也能入局的黄金赛道

当前职场就业市场的“冰火两重天”态势愈发鲜明:传统开发岗位需求持续萎缩,薪资增长陷入停滞,部分企业甚至出现缩编减岗的情况;反观AI应用开发工程师岗位,却迎来“缺口爆炸式增长”,薪资水平一路飙升&#…

作者头像 李华
网站建设 2026/5/6 0:21:53

整合蛋白序列/三维结构/功能特征等数据,德国团队基于度量学习构建构建人类E3泛素连接酶「全景图」

生物体中,细胞蛋白的及时降解与更新是维持蛋白稳态的关键。泛素-蛋白酶体系统(UPS)是调控信号传导和蛋白质降解的核心机制。在这一系统中,E3 泛素连接酶作为关键催化单元,负责识别特定底物并催化泛素标记,从…

作者头像 李华