版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Java高频面试题及详细答案(实战版)一、Java基础核心面试题1.谈谈==和equals的区别这是Java最基础的高频考点,核心区别分为两层,基本类型和引用类型:第一,基本数据类型。基本类型只有==,比较的是变量的实际数值,没有equals方法。第二,引用数据类型。==比较的是两个对象的内存地址,也就是判断是不是同一个对象;而equals是Object类的方法,默认逻辑和==一致,也是比较内存地址。但像String、Integer这些常用类,都重写了equals方法,重写后不再比较地址,而是直接比较对象的内容、数值是否相等。举个实战例子:newString("abc")=="abc"结果是false,因为地址不同;但两个字符串调用equals方法,结果是true,因为内容一致。2.String、StringBuilder、StringBuffer的区别三者核心差异围绕可变性、线程安全、性能三个维度,日常开发选型很常用:1、String:字符串常量,底层是final修饰的字符数组,不可变。每次拼接、修改字符串都会生成新的String对象,频繁操作会产生大量无用对象,占用内存,效率最低。适用于字符串极少修改、常量定义的场景。2、StringBuilder:可变字符串,底层数组可扩容,线程不安全,方法没有加锁。没有锁竞争,拼接性能最高。日常开发单线程字符串拼接、循环拼接优先使用。3、StringBuffer:可变字符串,线程安全,所有核心方法都加了synchronized锁。多线程环境下不会出现数据错乱,但锁会带来性能损耗,效率低于StringBuilder。现在除了老项目多线程字符串操作,基本很少使用。3.final、finally、finalize的区别三个关键字拼写相近,作用完全无关,是面试高频易混点:1、final:修饰符,用于定义不可变内容。修饰变量,变量变为常量,赋值后不可修改;修饰方法,方法不能被重写;修饰类,类不能被继承。日常开发用来定义常量、禁止类和方法被篡改。2、finally:异常处理关键字,搭配try-catch使用。代码块一定会执行(除了极端情况:JVM退出、线程被杀),常用于资源释放,比如关闭流、关闭数据库连接、释放锁,保证资源不泄漏。3、finalize:Object类的废弃方法,JDK9之后已废弃。原本是垃圾回收器回收对象前触发的方法,用于做对象最后的资源清理。但执行时机不确定、无法保证调用,存在严重性能和逻辑问题,现在开发中完全不使用。4.接口和抽象类的区别很多人容易混淆两者,核心区别在于设计思想、成员特性、继承规则:1、设计定位:抽象类是模板抽象,代表一类事物的共性,是“是什么”;接口是行为规范,代表对象的能力,是“能做什么”。2、成员特性:抽象类可以有构造方法、普通成员变量、普通方法、静态方法、抽象方法;JDK8之前接口只有常量和抽象方法,JDK8新增默认方法、静态方法,JDK9新增私有方法,没有构造方法,变量默认都是publicstaticfinal常量。3、继承规则:类只能单继承一个抽象类,但可以多实现多个接口,解决了单继承的局限性。4、使用场景:需要抽取子类通用属性和通用代码、做代码复用,用抽象类;需要定义统一行为规范、解耦、实现多态扩展,用接口。二、Java集合面试题1.ArrayList和LinkedList的区别两者都是List接口的实现,核心差异是底层数据结构,直接决定读写性能:1、底层结构:ArrayList底层是动态数组,连续内存空间;LinkedList底层是双向链表,节点分散存储,每个节点存储数据和前后节点指针。2、查询效率:ArrayList支持随机访问,通过下标直接定位元素,查询速度极快;LinkedList没有下标,查询需要从头节点遍历,查询效率极低。3、增删效率:ArrayList中间、头部增删元素需要移动大量元素,效率低;尾部新增效率很高。LinkedList只需要修改节点指针,任意位置增删效率都很高。4、内存占用:ArrayList会预留扩容空间,存在内存冗余;LinkedList每个节点都有指针,单个元素占用内存更大。实战选型:查询多、尾部新增多用ArrayList;频繁中间增删用LinkedList。日常开发90%场景都用ArrayList。2.HashMap的底层原理?JDK1.8做了哪些优化HashMap是开发最常用的键值对集合,面试必考,底层是数组+链表+红黑树的结构:1、核心原理:通过hash算法计算key的哈希值,对数组长度取模得到数组下标,将键值对存入对应位置。如果多个key哈希冲突,就在该下标位置形成链表;当链表长度过长,会转化为红黑树提升查询效率。2、JDK1.7底层:只有数组+链表,链表过长时查询效率会退化为O(n),且头插法会导致多线程下循环链表死循环问题。3、JDK1.8核心优化:①数据结构升级:引入红黑树,链表长度≥8且数组长度≥64时,链表转为红黑树,查询时间复杂度从O(n)优化为O(logn);链表长度≤6时,树退化为链表,减少树结构维护开销。②插入方式改为尾插法,彻底解决多线程扩容死循环问题。③优化哈希算法,减少哈希冲突概率。④扩容时机、阈值计算逻辑优化,性能更稳定。3.HashMap和ConcurrentHashMap的区别1、线程安全:HashMap线程不安全,多线程put、扩容会出现数据覆盖、丢失、死循环问题;ConcurrentHashMap是线程安全的并发集合。2、锁机制:JDK1.7的ConcurrentHashMap采用分段锁,将数组分为多个段,只锁当前操作的分段,并发度高;JDK1.8放弃分段锁,采用CAS+synchronized锁,只锁住当前链表/树的头节点,锁粒度更细,并发性能大幅提升。3、效率:HashMap无锁,单线程效率最高;ConcurrentHashMap适合多线程并发场景,性能远优于Hashtable。4、空值支持:HashMap允许key和value为null;ConcurrentHashMap不允许key、value为null,会直接空指针报错。三、多线程面试题1.线程和进程的区别1、进程:操作系统资源分配的最小单位,每个进程有独立的内存空间、CPU资源,进程之间相互独立,切换开销极大。比如IDEA、浏览器都是独立进程。2、线程:CPU调度的最小单位,是进程的组成部分。一个进程包含多个线程,线程共享进程的内存资源(堆、方法区),只拥有独立的栈内存,线程切换开销极小。3、核心特点:进程独立隔离,线程共享资源;进程崩溃互不影响,一个线程异常崩溃,会导致整个进程终止;多线程是Java并发编程的核心。2.synchronized和Lock的区别两者都是Java常用锁,用于解决并发安全问题,区别非常关键:1、锁类型:synchronized是内置锁,JVM底层实现,原生语法;Lock是显示锁,是Java的接口(常用实现类ReentrantLock),需要手动编码实现。2、加锁解锁:synchronized自动加锁、自动释放锁,代码执行完毕或异常都会自动解锁,无需手动处理;Lock需要手动lock()加锁、unlock()解锁,必须在finally中解锁,否则会造成死锁。3、锁特性:synchronized是可重入、不可中断、非公平锁;ReentrantLock支持可重入、可中断、可公平/非公平锁,还可以绑定多个条件变量,实现精准唤醒。4、性能:JDK1.6之后JVM对synchronized做了大量优化(偏向锁、轻量级锁、重量级锁),两者性能基本持平;高并发场景下Lock的灵活性更强。实战选型:简单并发场景优先用synchronized,代码简洁不易出错;需要公平锁、可中断锁、精准唤醒的复杂场景用ReentrantLock。3.线程的生命周期有哪些状态Java线程一共5种核心状态,贯穿线程整个执行流程:1、新建(NEW):创建线程对象后,未调用start()方法,处于初始状态。2、就绪(RUNNABLE):调用start()后,线程进入就绪队列,等待CPU调度,随时可以执行。3、运行(RUNNING):CPU分配时间片,线程正式执行run()方法逻辑。5、终止(TERMINATED):线程代码执行完毕或异常终止,线程生命周期结束。四、JVM面试题1.JVM内存区域划分JVM运行时数据区分为5个部分,各司其职:1、程序计数器:线程私有,唯一没有内存溢出的区域,记录当前线程执行的字节码行号,用于线程切换后恢复执行。2、虚拟机栈:线程私有,存储局部变量、方法参数、栈帧,方法调用和执行都依赖栈,栈深度过大会出现栈溢出(StackOverflowError)。3、本地方法栈:线程私有,作用和虚拟机栈类似,专门为Native本地方法服务。4、堆内存:线程共享,所有对象、数组都在堆中分配,是垃圾回收的核心区域,也是最容易发生OOM内存溢出的区域。分为新生代、老年代。5、方法区(元空间):线程共享,存储类信息、常量、静态变量、编译后的代码。JDK1.8之后彻底废弃永久代,改用元空间,直接使用本地内存,大幅减少OOM概率。2.垃圾回收机制(GC)原理,哪些对象会被回收GC的核心是自动回收堆中无用对象内存,避免内存泄漏,无需手动释放内存。1、回收判定:JVM采用可达性分析算法,以GCRoots为起点遍历引用链,没有被引用、不可到达的对象,判定为垃圾对象,会被回收。2、常见GCRoots:虚拟机栈中引用的对象、静态变量引用对象、常量引用对象、本地方法栈引用对象。3、垃圾回收分类:MinorGC(新生代回收,频率高、速度快)、FullGC(整堆回收,包含新生代、老年代,频率低、耗时久,尽量避免)。3.常见的OOM原因及解决思路OOM即内存溢出,是线上最常见的问题,核心原因是内存不足、对象无法被回收:1、常见场景:集合无限添加元素不清理、静态集合持有对象导致无法回收、循环创建大量对象、内存泄漏、JVM堆内存参数设置过小。2、解决思路:首先通过日志、dump文件定位溢出位置;优化代码,及时释放无用对象、清空集合;调整JVM堆内存参数;排查内存泄漏问题,避免长生命周期对象持有短生命周期对象引用。五、Spring核心面试题1.SpringIOC原理IOC即控制反转,是Spring的核心思想,颠覆了传统对象创建方式:传统开发中,开发者主动new对象、管理对象依赖,控制权在开发者手中;IOC将对象的创建、初始化、依赖注入、销毁全部交给Spring容器管理,控制权从开发者反转给容器,这就是控制反转。核心实现流程:项目启动时,Spring扫描指定包下的注解类(@Component、@Service等),通过反射创建Bean对象,存入IOC容器(Map结构),根据依赖关系自动完成属性注入,程序使用时直接从容器获取Bean即可。核心作用:解耦,彻底消除代码硬依赖,方便后续扩展、测试和维护。2.SpringAOP原理及应用场景AOP即面向切面编程,核心是在不修改原有业务代码的前提下,对方法进行增强,实现代码解耦。底层原理是动态代理:目标类有接口时,使用JDK动态代理;没有接口时,使用CGLIB字节码增强代理。核心应用场景:日志记录、事务控制、权限校验、接口限流、性能监控、异常统一处理。Spring的声明式事务就是基于AOP实现的。3.SpringBean的生命周期SpringBean从创建到销毁分为完整的7个核心步骤,面试常问完整流程:1、实例化:Spring通过反射创建Bean实例对象;2、属性填充:自动完成依赖注入,给Bean的属性赋值;3、前置处理:执行BeanPostProcessor的前置处理方法;4、初始化:执行InitializingBean初始化方法、自定义init-method;5、后置处理:执行BeanPostProcessor的后置处理方法;6、就绪使用:Bean完成初始化,存入容器,可供业务调用;7、销毁:容器关闭时,执行DisposableBean销毁方法、自定义destroy-method。六、数据库&Redis面试题1.MySQL索引原理,B+树为什么适合做索引MySQLInnoDB引擎索引底层采用B+树结构,相比二叉树、B树优势极大:1、层级更低:B+树是多叉平衡树,节点分支多、树高度极低,磁盘IO次数少,查询速度快;二叉树高度太高,IO频繁,效率极低。2、数据存储集中:B+树非叶子节点只存索引键,不存数据,存储空间利用率高,一页磁盘可以存储更多索引,缓存效果更好;所有数据都存在叶子节点。3、有序遍历:B+树叶子节点通过链表串联,有序排列,适合范围查询、排序、分页查询,这是B树不具备的优势。2.事务四大特性(ACID)1、原子性(Atomicity):事务是最小执行单元,要么全部执行成功,要么全部回滚,不会出现部分执行的情况。2、一致性(Consistency):事务执行前后,数据库数据完整性、约束规则保持一致,不会出现非法数据。3、隔离性(Isolation):多个事务并发执行时,相互隔离,互不干扰,通过事务隔离级别控制并发问题。4、持久性(Durability):事务提交成功后,数据永久落地,即使服务器宕机,数据也不会丢失。3.Redis缓存穿透、击穿、雪崩的解决方案1、缓存穿透:查询数据库和缓存都没有的数据,请求直接打穿到数据库。解决方案:接口参数校验、空值缓存、布隆过滤器拦截无效请求。2、缓存击穿:热点Key过期瞬间,大量并发请求直接访问数据库。解决方案:热点Key永
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 销售团队目标设定与达成手册
- 航空零部件精密制造技术员绩效考评表
- 办公耗材库存盘点安排通知函6篇
- 电商售后服务主管服务质量绩效衡量表
- 项目环保科技项目经理绩效评估表
- 环保科技公司绿色生产方案
- 技术专家处理速度与解决方案成效考核表
- 智能物流中心快递包装规范手册
- 交通运输业乘务长工作成果考核表
- 医生不合理用药自查自纠整改报告2篇
- 《汕头PS成功案例》课件
- 【第一次月考】2026 秋七年级上册道法第一次月考卷(统编版素养测评)
- 电子天平的使用-课件
- 应用PDCA提高入院宣教的知晓率
- 深静脉血栓(DVT)课件
- QCSG1140022023年电力设备预防性试验规程
- 魅力黔东南2-(2)课件
- 高处作业吊篮安全技术交底表
- 瑞士CYBELEC DNC 60系统使用说明书
- 高三物理动量和能量的综合应用 板块模型
- 真功夫人事实务手册
评论
0/150
提交评论