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

【Java面试题02】Java 集合常见面试题

文章目录

  • 一、前言🚀🚀🚀
  • 二、Java 基础面试题:☀️☀️☀️
      • 1、说说 Java 中 HashMap 的原理?
      • 2、HashMap 的扩容机制?
      • 3、为什么 Java 中 HashMap 的默认负载因子是 0.75?
      • 4、JDK 1.8 对 HashMap 除了红黑树还进行了哪些改动?
      • 5、Java 中 ConcurrentHashMap 1.7 和 1.8 之间有哪些区别?
      • 6、数组和链表在 Java 中的区别是什么?
  • 后序还在更新中~~~
  • 三、总结:🍓🍓🍓


一、前言🚀🚀🚀

在这里插入图片描述

☀️
你每一天的努力会在未来的某一个点交汇成宏伟的画面。


本文简介:本人是大二软件工程专业,java后端方向,学习路线:java基础->JDBC->Maven->MyBatis->SSM,通过做笔记分享到博客上的形式,激励自己学习,同时方便复习。由于水平为入门级别,如有错误,希望大佬们评论或私信斧正 Thanks♪(・ω・))ノ



二、Java 基础面试题:☀️☀️☀️

1、说说 Java 中 HashMap 的原理?

  HashMap 是基于哈希表的数据结构,用于存储键值对(key-value)。其核心是将键的哈希值映射到数组索引位置,通过数组 + 链表(在 Java 8 及之后是数组 + 链表 + 红黑树)来处理哈希冲突。
  HashMap 使用键的 hashCode() 方法计算哈希值,并通过 indexFor 方法(JDK 1.7 及之后版本移除了这个方法,直接使用 (n - 1) & hash)确定元素在数组中的存储位置。哈希值是经过一定扰动处理的,防止哈希值分布不均匀,从而减少冲突。
HashMap 的默认初始容量为 16,负载因子为 0.75。也就是说,当存储的元素数量超过 16 × 0.75 = 12 个时,HashMap 会触发扩容操作,容量x2并重新分配元素位置。这种扩容是比较耗时的操作,频繁扩容会影响性能。

2、HashMap 的扩容机制?

  HashMap 的默认初始容量为 16,负载因子为 0.75。也就是说,当存储的元素数量超过 16 × 0.75 = 12 个时,HashMap 会触发扩容操作,容量x2并重新分配元素位置。
  扩容时,Hashmap需要重新计算所有元素的哈希值,并将它们重新分配到新的哈希桶中,这个过程称为rehashing。每个元素的存储位置会根据新容量的大小重新计算哈希值,并移动到新的数组中。
  这种扩容是比较耗时的操作,频繁扩容会影响性能。

3、为什么 Java 中 HashMap 的默认负载因子是 0.75?

  是为了在时间复杂度和空间复杂度之间取得一个合理的平衡,负载因子为 0.75 时,避免过多扩容的同时,也保证了不会出现过多的哈希冲突,
  确保查找和插入操作的效率,维持良好的性能表现。

4、JDK 1.8 对 HashMap 除了红黑树还进行了哪些改动?

  改进了哈希函数的计算:JDK 1.8 中优化了哈希函数,使得哈希值的分布更加均匀,减少了哈希冲突的发生,通过在生成哈希值时使用“扰动函数”,确保哈希值的高低位都能参与到桶的选择中。
  扩容机制优化:JDK 1.8 改进了扩容时的元素迁移机制。在扩容过程中不再对每个元素重新计算哈希值,而是根据原数组长度的高位来判断元素是留在原位置,还是迁移到新数组中的新位置。这一改动减少了不必要的计算,提升了扩容效率。
  头插法变为尾插法:头插法的好处就是插入的时候不需要遍历链表,直接替换成头结点,但是缺点是扩容的时候会逆序,而逆序在多线程操作下可能会出现环,产生死循环,于是改为尾插法。

5、Java 中 ConcurrentHashMap 1.7 和 1.8 之间有哪些区别?

  JDK 1.7 ConcurrentHashMap 采用的是分段锁,即每个 Segment 是独立的,可以并发访问不同的 Segment,默认是 16 个 Segment,所以最多有 16 个线程可以并发执行。
  而 JDK 1.8 移除了 Segment,锁的粒度变得更加细化,锁只在链表或红黑树的节点级别上进行。通过 CAS 进行插入操作,只有在更新链表或红黑树时才使用 synchronized,并且只锁住链表或树的头节点,进一步减少了锁的竞争,并发度大大增加。
并且 JDK 1.7 ConcurrentHashMap 只使用了数组 + 链表的结构,而 JDK 1.8 和 HashMap一样引入了红黑树。
  除此之外,还有扩容的区别以及 size 方法的计算也不一样。

6、数组和链表在 Java 中的区别是什么?

  1、数组是内存中连续的空间,而链表可以不连续
  2、数组长度固定,如果需要扩展数组,需要重新开辟一片空间使用。而链表可以直接用指针指向不同的地址,扩展方便。
  3、在读取多的场景下适合用数组,数组可以直接用下标访问,而在插入和删除操作多的场景下适合用链表4、链表需要额外的空间存储指针,占用的空间会比数组更多。

  
  
  
  
    
  
  
  
  

后序还在更新中~~~

Alt

三、总结:🍓🍓🍓

提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。
Alt


http://www.mrgr.cn/news/100519.html

相关文章:

  • 【数据结构】哈希表
  • 如何搭建spark yarn模式的集群
  • Qt中的全局函数讲解集合(全)
  • gem5-gpu教程03 当前的gem5-gpu软件架构(因为涉及太多专业名词所以用英语表达)
  • 刷刷刷刷刷RCE
  • 初识Redis · 哨兵机制
  • git检查提交分支和package.json的version版本是否一致
  • 【Linux应用】开发板快速上手:镜像烧录、串口shell、外设挂载、WiFi配置、SSH连接、文件交互(RADXA ZERO 3为例)
  • Python+Selenium+Pytest+Allure PO模式UI自动化框架
  • Java 富文本转word(支持水印)
  • 关于Spring Boot构建项目的相关知识
  • ubuntu 安装ollama后,如何让外网访问?
  • 继续 那个错误分析
  • JVM常见的垃圾回收器
  • 网络:手写HTTP
  • cocos creator使用jenkins打包流程,打包webmobile
  • Python3:Jupyter Notebook 安装和配置
  • Crawl4AI 部署安装及 n8n 调用,实现自动化工作流(保证好使)
  • 【视频生成模型】通义万相Wan2.1模型本地部署和LoRA微调
  • 在 Cursor 中 配置 GitHub MCP Server