2025年金三银四整理Java面试合集(1000道附答案解析).docxVIP

2025年金三银四整理Java面试合集(1000道附答案解析).docx

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多

2025年金三银四整理Java面试合集(1000道附答案解析)

Java语言特性与基础

Q:Java中String、StringBuilder、StringBuffer的区别及使用场景?

A:三者均用于处理字符串,核心差异在不可变性与线程安全。String类内部通过final修饰的char数组存储(JDK9后改为byte数组),具有不可变性,每次修改会提供新对象,适合少量字符串操作或需要缓存的场景(如字符串常量池)。StringBuilder内部使用可变char数组,无同步锁,线程不安全但性能高,适用于单线程下的大量字符串拼接(如循环内拼接)。StringBuffer对关键方法添加了synchronized关键字,线程安全但性能略低,适用于多线程环境下的字符串操作(如共享缓冲区)。需注意:JDK8及以上对String的+操作会优化为StringBuilder,但循环内使用+仍会频繁创建对象,应显式使用StringBuilder。

Q:Java基本数据类型有哪些?各自的内存占用与取值范围?

A:8种基本类型:byte(1字节,-128~127)、short(2字节,-32768~32767)、int(4字节,-2^31~2^31-1)、long(8字节,-2^63~2^63-1)、float(4字节,约±3.4e38,单精度)、double(8字节,约±1.7e308,双精度)、char(2字节,0~65535)、boolean(JVM规范未明确大小,实际实现多为1字节或4字节)。注意:基本类型存储于栈(方法内)或堆(对象属性),包装类存储于堆并可调用方法,自动装箱/拆箱通过Integer.valueOf()和intValue()实现,其中Integer缓存-128~127的对象,超出范围会新建实例。

Q:HashMap的底层结构?JDK7与JDK8的主要差异?

A:JDK7中HashMap采用数组+链表结构,数组为EntryK,V[],链表用于解决哈希冲突。核心操作:put时计算key的hash值(高16位异或低16位减少碰撞),取模数组长度定位桶位置,遍历链表插入(头插法);扩容时数组长度翻倍(2的幂次保证取模效率),重新计算哈希并迁移节点。

JDK8优化为数组+链表+红黑树结构:当链表长度≥8且数组长度≥64时,链表转为红黑树(O(n)→O(logn)查询);当红黑树节点数≤6时退化为链表。其他差异:put改为尾插法(避免多线程扩容时的循环链表问题);hash计算简化为(h=key.hashCode())^(h16);扩容时节点迁移采用“原位置”或“原位置+旧容量”的方式,无需重新计算哈希。需注意:默认初始容量16,负载因子0.75(空间与时间的平衡),自定义容量应取2的幂次(通过tableSizeFor()方法调整)。

Q:如何解决HashSet存储自定义对象时的重复问题?

A:HashSet基于HashMap实现,元素作为key存储,value为固定对象PRESENT。判断重复依赖key的hashCode()和equals()方法:首先通过hashCode()计算桶位置,若不同桶直接认为不重复;若同桶则遍历链表/红黑树,通过equals()比较对象内容。因此,自定义类需重写hashCode()和equals():equals()应比较核心业务属性(如用户类的id),hashCode()需基于相同属性计算(可使用Objects.hash(id)),且保证“相等对象哈希值相同”。示例:若仅重写equals()而不重写hashCode(),会导致相同对象存储在不同桶中,HashSet认为不重复。

并发编程

Q:线程池的核心参数有哪些?拒绝策略的类型及适用场景?

A:ThreadPoolExecutor的7大参数:corePoolSize(核心线程数,保留在线程池中的线程数)、maximumPoolSize(最大线程数,允许的最大线程数)、keepAliveTime(非核心线程空闲存活时间)、unit(时间单位)、workQueue(任务队列,存储待执行任务)、threadFactory(线程工厂,创建工作线程)、handler(拒绝策略,任务无法处理时的回调)。

拒绝策略4种实现:

1.AbortPolicy(默认):抛出RejectedExecutionException,适用于敏感业务(如金融交易,强制感知失败)。

2.CallerRunsPolicy:调用者线程执行任务,适用于流量控制(降低提交速度)。

3.DiscardPolicy:静默丢弃新任务,适用于允许丢失的非关键任务(如日志记录)。

4.DiscardOldestPoli

文档评论(0)

yclhdq + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档