版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
2026年Java高频面试题及详细答案(实战版)一、Java基础核心面试题1.说说JDK、JRE、JVM的区别与联系这三者是层层包含的关系,范围从大到小依次是JDK>JRE>JVM。JVM是Java虚拟机,是Java程序运行的核心环境,只负责解析执行class字节码文件,不包含任何开发工具,是跨平台的核心,不同系统有对应版本的JVM。JRE是Java运行环境,包含JVM+Java核心类库,只用于运行Java程序,普通用户部署运行项目只需要安装JRE,无法进行代码开发。JDK是Java开发工具包,包含JRE+编译、调试、打包等开发工具(javac、java、jar等),开发人员必须安装JDK才能编写、编译、测试Java代码。简单总结:JVM负责跑程序,JRE负责提供运行依赖,JDK负责开发+运行。2.==和equals的区别==是比较运算符,既可以比较基本数据类型,也可以比较引用数据类型。基本类型比较的是数值本身,引用类型比较的是内存地址。equals是Object类的方法,默认情况下和==效果一致,比较对象内存地址。但String、Integer等包装类重写了equals方法,重写后只比较对象内容,不比较地址。实战高频场景:newString("a")=="a"结果是false,地址不同;equals比较结果是true,内容一致。3.String、StringBuilder、StringBuffer的区别1.可变性:String是不可变字符串,每次拼接、修改都会生成新字符串对象;StringBuilder和StringBuffer是可变字符串,修改不会创建新对象。2.线程安全:StringBuffer所有方法加了synchronized锁,线程安全,适合多线程场景;StringBuilder无锁,线程不安全,效率更高,是单线程首选。3.性能:日常开发单线程字符串拼接,优先用StringBuilder,性能远高于String和StringBuffer。4.使用场景:少量字符串操作用String;单线程大量拼接用StringBuilder;多线程拼接用StringBuffer。4.基本数据类型和包装类的区别,自动装箱拆箱原理Java有8种基本数据类型(byte、short、int、long、float、double、char、boolean),直接存储数值,占用内存小,不存在对象,默认值为0、false等。对应的包装类是对象类型,继承Object,默认值为null,可泛型、可存放到集合中,具备对象的特性(调用方法、空值判断)。自动装箱:基本类型自动转为包装类,底层执行Integer.valueOf()方法;自动拆箱:包装类自动转为基本类型,底层执行intValue()等方法。高频坑点:Integer缓存机制,-128~127之间的数值装箱会复用缓存对象,==比较为true;超出范围会新建对象,==比较为false。5.final、finally、finalize的区别1.final:修饰符,修饰类则类不能被继承;修饰方法则方法不能重写;修饰变量则变量不可修改(基本类型值不变,引用类型地址不变)。2.finally:异常处理关键字,搭配try-catch使用,无论代码是否抛出异常,最终都会执行,常用于释放资源(关闭流、连接)。唯一不执行场景:调用System.exit(0)退出程序。3.finalize:Object类的废弃方法,JVM垃圾回收前会调用该方法,用于对象收尾资源释放。JDK9之后已废弃,效率极低、执行时机不确定,开发中禁止使用。二、Java集合面试题(2026高频)1.ArrayList和LinkedList的区别及使用场景1.底层结构:ArrayList基于动态数组;LinkedList基于双向链表。2.访问效率:ArrayList随机访问(get)速度快,支持下标索引;LinkedList随机访问慢,需要遍历链表。3.增删效率:ArrayList末尾增删快,中间、头部增删需要移动数组元素,效率低;LinkedList任意位置增删只需修改节点指针,效率更高。4.内存占用:ArrayList内存连续,存在冗余容量;LinkedList每个节点存储数据和前后指针,内存占用更高。场景:日常查询遍历多、增删少优先用ArrayList;频繁中间/头部增删、遍历少用LinkedList(实际开发中ArrayList使用率95%以上)。2.HashMap底层原理(JDK1.8重点)HashMap底层是数组+链表+红黑树结构,基于哈希表实现,用于存储键值对,无序、key唯一、允许null键null值。核心流程:put元素时,通过key的hash值计算数组下标,下标位置无元素则直接存入;有元素则发生哈希冲突,采用链地址法解决。JDK1.8优化:链表长度大于8且数组容量大于64时,链表转为红黑树,提升查询效率;链表长度小于6时,红黑树退化为链表。默认初始容量16,负载因子0.75,容量达到16*0.75=12时触发扩容,每次扩容为原容量2倍,扩容时会重新哈希分布元素。为什么用红黑树不用平衡二叉树:红黑树牺牲部分平衡度,减少旋转次数,增删效率更高,适合HashMap高频读写场景。3.HashMap和ConcurrentHashMap的区别1.线程安全:HashMap线程不安全,多线程put、扩容会出现数据覆盖、死循环问题;ConcurrentHashMap是线程安全的并发集合。2.锁机制:JDK1.7的ConcurrentHashMap采用分段锁;JDK1.8放弃分段锁,采用CAS+synchronized锁,只锁定当前哈希桶节点,锁粒度更小、并发效率更高。3.并发度:HashMap无并发能力;ConcurrentHashMap支持高并发读写,读操作无锁,写操作局部加锁。4.空值限制:ConcurrentHashMap不允许key和value为null,避免并发场景空指针歧义;HashMap允许一个nullkey、多个nullvalue。4.HashSet底层原理HashSet底层直接依赖HashMap,HashSet存储的元素就是HashMap的key,HashMap的value统一为一个固定的空对象常量。所以HashSet去重原理和HashMapkey去重一致:先对比hash值,hash值相同再通过equals方法判断内容是否相同,相同则覆盖,不同则新增。HashSet无序、唯一,线程不安全,日常去重场景常用。三、多线程与并发面试题1.线程和进程的区别进程是操作系统资源分配的最小单位,独立占用内存、CPU资源,进程之间相互独立,切换开销大。线程是CPU调度的最小单位,隶属于进程,一个进程包含多个线程,线程共享进程的内存资源(堆、方法区),独有栈内存,线程切换开销极小。核心区别:进程独立隔离,线程共享资源;进程开销大,线程轻量高效。Java程序默认单进程多线程。2.线程的生命周期有哪些状态Java线程一共6种状态(JDK官方定义):1.NEW(新建):创建线程对象,未调用start()方法;2.RUNNABLE(就绪+运行):调用start()后,等待CPU调度或正在执行;3.BLOCKED(阻塞):等待获取synchronized锁;6.TERMINATED(终止):线程执行完毕或异常退出。3.synchronized和Lock的区别1.底层层面:synchronized是JVM原生关键字,底层依赖虚拟机指令实现;Lock是Java代码层面的接口,基于AQS队列实现。2.锁特性:synchronized是隐式锁,自动加锁、自动释放锁;Lock是显式锁,需要手动lock()加锁、unlock()释放锁。3.锁灵活性:synchronized不可中断、无法超时、不支持公平锁;Lock支持可中断锁、超时锁、公平锁、读写锁,功能更全面。4.性能:JDK1.6之后synchronized做了偏向锁、轻量级锁、重量级锁优化,性能和Lock基本持平,低并发场景synchronized更简洁。实战建议:简单同步场景用synchronized,高并发、需要精细控制锁的场景用Lock(ReentrantLock)。4.volatile关键字的作用和局限性volatile核心作用两点:保证可见性、禁止指令重排。可见性:多线程场景下,一个线程修改volatile变量,其他线程能立即感知到最新值,避免缓存过期。指令重排:禁止编译器和CPU对变量操作指令重排序,解决单例模式DCL的线程安全问题。局限性:不保证原子性,无法解决i++这类复合操作的线程安全问题,只能保证单次读写的线程安全。5.线程池核心参数及工作原理核心参数7个:核心线程数、最大线程数、空闲超时时间、时间单位、任务队列、线程工厂、拒绝策略。工作流程:提交任务后,首先判断核心线程数是否已满,未满则创建核心线程执行任务;核心线程满了,任务进入队列排队;队列满了,创建非核心线程执行任务;线程数达到最大值,触发拒绝策略。四种拒绝策略:AbortPolicy(直接抛异常,默认)、CallerRunsPolicy(调用者线程执行)、DiscardPolicy(丢弃任务)、DiscardOldestPolicy(丢弃队列最旧任务)。开发规范:禁止使用Executors创建线程池,必须手动通过ThreadPoolExecutor创建,明确参数,避免OOM。四、JVM面试题(2026必问)1.JVM内存区域划分JVM运行时数据区分为5个区域,线程私有3个、线程共享2个:线程私有:程序计数器(唯一无OOM区域)、虚拟机栈、本地方法栈;线程共享:堆内存(存放对象、数组,GC主要回收区域)、方法区(JDK1.8后为元空间,存放类信息、常量、静态变量)。2.堆内存结构及GC流程JDK1.8堆内存分为新生代、老年代,元空间替代永久代。新生代:分为Eden区、两个Survivor区(S0、S1),比例8:1:1,存放新建对象,GC频率高。老年代:存放存活时间久、大对象,GC频率低。GC流程:新对象优先分配Eden区,Eden满触发MinorGC,存活对象移入Survivor区;对象在Survivor区熬过15次GC,晋升老年代;老年代空间不足触发MajorGC,频繁MajorGC大概率存在内存泄漏。3.常见垃圾回收器及适用场景1.G1回收器:JDK9默认,面向大内存、低延迟,分区回收,兼顾吞吐量和停顿时间,企业主流使用。2.ZGC回收器:JDK17主推,超低延迟,停顿时间控制在毫秒级,适合高并发、低延迟互联网项目。3.ParallelGC:高吞吐量,适合后台批量任务、非实时项目。4.CMSGC:低延迟,JDK14后废弃,存在内存碎片、并发失败问题,新项目不再使用。4.什么是内存泄漏?常见场景及排查方式内存泄漏:程序中无用对象持续被引用,GC无法回收,导致内存占用持续升高,最终引发OOM。常见场景:静态集合常驻内存、未关闭IO流/数据库连接、线程池线程不销毁、长生命周期对象持有短生命周期对象引用。排查方式:通过jstack、jmap、jstat命令查看内存状态,导出dump文件,用MAT、JProfiler分析大对象、泄漏对象,定位代码问题。五、Spring/SpringBoot面试题1.SpringIOC原理IOC即控制反转,核心是将对象的创建、管理、依赖注入交给Spring容器,而非开发者手动new对象,实现代码解耦。执行流程:项目启动加载配置类/配置文件,Spring扫描所有注解标记的Bean,通过反射创建对象,存入IOC容器(Map结构),自动完成依赖注入,程序使用时直接从容器获取Bean。依赖注入方式:构造器注入(Spring官方推荐)、setter注入、字段注入。2.SpringAOP原理及应用场景AOP面向切面编程,基于动态代理实现,在不修改原有业务代码的前提下,对方法进行增强,实现公共逻辑复用。底层原理:目标类有接口则用JDK动态代理,无接口则用CGLIB字节码增强代理。核心场景:统一日志记录、事务控制、权限校验、接口限流、性能监控、异常统一处理。核心注解:@Aspect、@Before、@After、@Around、@AfterThrowing。3.SpringBean的生命周期完整流程:实例化(反射创建对象)→属性填充(依赖注入)→初始化前置处理→初始化方法执行→初始化后置处理→Bean就绪可用→容器关闭销毁Bean。日常开发中,最常用的是@PostConstruct自定义初始化逻辑、@PreDestroy自定义销毁逻辑。4.SpringBoot自动配置原理核心依赖@SpringBootApplication注解,底层包含三个核心注解:1.@ComponentScan:自动扫描当前包及子包下的所有Bean;2.@Configuration:标记当前类为配置类;3.@EnableAutoConfiguration:读取META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件,加载所有默认自动配置类,根据项目依赖自动装配组件(如Redis、Mybatis、Web容器)。简单说:引入依赖就自动配置,无需手动写XML和配置类,简化开发。5.Spring事务传播机制和隔离级别传播机制(7种,重点3种):REQUIRED(默认):有事务就加入,无事务新建事务;SUPPORTS:有事务加入,无事务非事务运行;REQUIRES_NEW:新建独立事务,挂起原有事务。隔离级别(4种):READ_UNCOMMITTED(读未提交)、READ_COMMITTED(读已提交,Oracle默认)、REPEATABLE_READ(可重复读,MySQL默认)、SERIALIZABLE(串行化)。事务失效常见场景:方法非public、内部调用、捕获异常未抛出、数据库引擎不支持事务(MyISAM)。六、数据库与MyBatis面试题1.MySQL索引原理,B+树为什么优于B树MySQLInnoDB引擎索引基于B+树实现。B+树所有数据都存在叶子节点,非叶子节点只存索引键,不存数据。优势:1.单层节点存储索引更多,树的高度更低,磁盘IO次数更少,查询更快;2.所有叶子节点链表相连,范围查询、排序查询效率极高;3.结构更稳定,增删节点不会频繁重构树结构。2.聚簇索引和非聚簇索引区别聚簇索引:主键索引,叶子节点存储整行数据,一张表只有一个,查询速度最快。非聚簇索引(二级索引):普通索引、唯一索引,叶子节点存储主键值,查询时需要先查二级索引拿到主键,再回表查聚簇索引获取数据,也就是回表查询。覆盖索引:查询字段全部在二级索引中,无需回表,性能最优。3.MySQL慢查询优化思路1.开启慢查询日志,定位慢SQL;2.用explain分析执行计划,查看是否命中索引、是否存在全表扫描、临时表、文件排序;3.避免索引失效(like%xxx、or、字段隐式转换、notin等);4.建立合理联合索引,遵循最左匹配原则;5.优化limit分页、避免大事务、减少回表查询,使用覆盖索引。4.MyBatis#{}和${}的区别#{}:预编译占位符,会自动拼接?,通过JDBC预编译赋值,防止SQL注入,自动做类型转换,日常参数查询优先使用。${}:直接字符串拼接,无预编译,存在SQL注入风险,不会转换类型。仅用于动态表名、排序字段等无法使用预编译的场景。七、Redis与微服务高频面试题1.Redis为什么快1.纯内存操作,无需磁盘IO;2.单线程模型,无线程切换、锁竞争开销;3.IO多路复用模型,高效处理大量并发连接;4.数据结构设计精简,底层编码优化;5.避免冗余系统调用,执行效率极高。2.Redis缓存穿透、击穿、雪崩解决方案缓存穿透:查询不存在的数据,直接打穿到数据库。解决方案:布隆过滤器、空值缓存、接口限流校验。缓存击穿:热点key过期,瞬间大量请求打到数据库。解决方案:热点key永不过期、互斥锁、二级缓存。缓存雪崩:大量key同时过期/Redis宕机,请求全部涌入数据库。解决方案:过期时间随机打散、Redis集群高可用、服务
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 危险化学品安全培训考试试题及答案
- 卫生保洁服务人员专业技能理论考核试题及答案
- 物流管理试题及参考答案
- 小学食堂餐饮服务食品安全知识培训考试题及答案
- 新员工客户服务能力测试题目与答案及答案
- 新入职护士考试试题及答案
- 液化气从业人员考试题及答案
- 知识竞赛试题及答案
- 医疗器械生产培训试卷及答案
- 2025年广西壮族自治区百色市初二地理上册期中考试试卷及答案
- 幼儿消毒知识培训课件
- 知道智慧树解密黄帝内经满分测试答案
- 自然流产指南解读
- 鼻内镜下鼻息肉摘除术的手术配合
- CJ/T 256-2016分体先导式减压稳压阀
- 电话卡出售协议合同
- 2024-2025学年高一下学期《重温红色故事 铭记长征精神》主题班会课件
- 《石油工程技术职业素养》课件-钻井八大系统
- 游乐场项目策划方案
- 学校办公室主任年度考核个人述职报告(四篇合集)
- 2024年中国北方工业有限公司招聘笔试参考题库含答案解析
评论
0/150
提交评论