版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Java高频面试题总结及详细答案(实战版)一、Java基础核心面试题1.JDK、JRE、JVM的区别与联系答案:三者是层层包含的关系,范围从大到小为JDK>JRE>JVM。1、JVM(Java虚拟机):是Java程序运行的核心载体,负责加载字节码文件、解释/编译执行代码、内存管理、垃圾回收。本身不包含开发工具,仅负责程序运行,是Java跨平台的核心。2、JRE(Java运行环境):包含JVM+Java核心类库(lang、util、io等基础包)。仅用于运行Java程序,不具备代码编译、调试等开发功能,普通用户运行Java程序只需安装JRE。3、JDK(Java开发工具包):包含JRE+开发工具(javac编译器、java运行命令、jmap、jstack调试工具等)。是开发人员必备的环境,既能开发编译代码,也能运行程序。2.==和equals()的区别答案:1、==是运算符,可用于基本数据类型和引用数据类型:-基本数据类型:比较的是数值本身是否相等;-引用数据类型:比较的是对象的内存地址是否相同,即是否是同一个对象。2、equals()是Object类的方法,仅适用于引用数据类型:-Object类原生equals()方法底层就是==,比较对象地址;-String、Integer等包装类重写了equals(),重写后比较的是对象内容是否相等,不再比较地址。日常开发中,比较字符串、对象内容是否一致,必须使用equals();比较基本类型数值用==。3.String、StringBuilder、StringBuffer的区别答案:1、可变性:-String:不可变字符串,底层是final修饰的字符数组,每次拼接、修改都会生成新的String对象,效率低;-StringBuilder、StringBuffer:可变字符串,底层数组可动态扩容,修改不会生成新对象。2、线程安全:-StringBuffer:方法加了synchronized锁,线程安全,多线程环境可用;-StringBuilder:无锁,线程不安全,单线程环境使用;-String:不可变,天然线程安全。3、效率:StringBuilder>StringBuffer>String使用场景:少量字符串操作用String;单线程大量拼接用StringBuilder;多线程大量拼接用StringBuffer。4.final、finally、finalize的区别答案:1、final:修饰符,用于限制变量、方法、类:-final变量:一旦赋值不可修改,常量;-final方法:不可被子类重写;-final类:不可被继承。2、finally:异常处理关键字,搭配try-catch使用。无论代码是否抛出异常、是否return,finally中的代码一定会执行(除JVM退出等极端情况),常用于释放资源(关闭流、连接)。3、finalize:Object类的废弃方法,JDK9之后废弃。原本用于垃圾回收前唤醒,让对象完成资源收尾,执行时机不确定、无法保证,开发中绝对不使用。5.基本数据类型和包装类的区别答案:1、基本类型:8种(byte、short、int、long、float、double、char、boolean),存储在栈内存,无对象、无默认null,默认有数值,效率高。2、包装类:基本类型的对象封装(Integer、Long等),存储在堆内存,是对象类型,默认值为null,包含大量工具方法(类型转换、数值判断)。3、自动装箱拆箱:JDK5+自动转换,基本类型转包装类为装箱,包装类转基本类型为拆箱。注意:Integer有缓存机制,-128~127范围内的数值,装箱后复用对象,==比较为true;超出范围新建对象,==为false,内容比较必须用equals。二、Java集合高频面试题1.ArrayList和LinkedList的区别答案:1、底层结构:-ArrayList:基于动态扩容数组;-LinkedList:基于双向链表。2、查询效率:ArrayList随机访问快(数组下标寻址),LinkedList随机查询慢(需要遍历链表)。3、增删效率:ArrayList尾部增删快,中间、头部增删需要移动元素,效率低;LinkedList任意位置增删只需修改节点指针,效率更高。4、内存占用:ArrayList会预留扩容空间,存在内存冗余;LinkedList每个节点存储数据+前后指针,单个元素占用内存更大。场景:大量查询、少量增删用ArrayList;大量增删、少量查询用LinkedList。2.HashMap的底层原理(JDK1.8)答案:HashMap底层是数组+链表+红黑树,基于哈希表实现,用于存储键值对,无序、允许key和value为null、线程不安全。1、存储流程:根据key的hash值计算数组下标,判断数组位置是否为空,为空则直接存入;不为空则判断key是否重复,重复则覆盖value;不重复则挂载链表。2、树化规则:当链表长度大于8且数组容量大于64,链表转为红黑树,提升查询效率;当红黑树节点数量小于6,退化为链表。3、扩容机制:默认初始容量16,负载因子0.75,当元素数量达到容量*负载因子时触发扩容,容量翻倍,重新哈希分配元素。4、JDK1.8优化:新增红黑树结构,解决JDK1.7链表过长查询慢的问题;扩容时优化哈希计算,减少元素重排次数。3.HashMap和HashTable、ConcurrentHashMap的区别答案:1、HashMap:线程不安全,允许key、value为null,效率高,底层数组+链表+红黑树,适用于单线程。2、HashTable:线程安全(全表锁),不允许null键值,效率极低,基本被淘汰。所有方法加synchronized,并发时所有线程竞争同一把锁。3、ConcurrentHashMap:线程安全且高效,JDK1.8底层采用CAS+分段锁,细化锁粒度,只锁定当前操作的数组节点,不影响其他节点读写;支持并发,适用于多线程场景,允许value为null,key不允许null。4.List、Set、Map的区别答案:1、List:有序可重复集合,可通过下标访问元素,代表实现:ArrayList、LinkedList。2、Set:无序不可重复集合,无下标,元素唯一,代表实现:HashSet、TreeSet。HashSet基于HashMap实现,保证元素唯一性;TreeSet可自然排序。3、Map:键值对集合,key唯一、value可重复,无序,独立于Collection体系,代表实现:HashMap、ConcurrentHashMap、TreeMap。三、多线程与并发面试题1.线程和进程的区别答案:1、进程:操作系统资源分配的最小单位,独立占用内存、CPU资源,进程之间相互独立,切换开销大。2、线程:进程内的执行单元,CPU调度的最小单位,共享进程的内存资源(堆、方法区),线程之间切换开销小。3、关系:一个进程至少包含一个线程,多线程是在一个进程内并发执行多个任务,提升资源利用率。2.线程的生命周期及状态答案:Java线程共6种状态:1、新建(NEW):创建线程对象,未调用start();2、就绪(RUNNABLE):调用start(),等待CPU调度;3、运行(RUNNING):获取CPU时间片,执行run()方法;4、阻塞(BLOCKED):等待获取锁资源,同步阻塞;7、终止(TERMINATED):线程执行完毕或异常终止。3.synchronized和Lock的区别答案:1、底层层面:synchronized是JVM原生关键字,底层由虚拟机实现;Lock是Java接口(ReentrantLock),代码层面实现锁机制。2、锁特性:-synchronized:自动加锁解锁,锁不可中断,默认非公平锁,可修饰方法、代码块;-Lock:手动lock()加锁、unlock()解锁,可中断锁、可设置超时、支持公平/非公平锁、可绑定多个条件锁,灵活性更高。3、适用场景:简单同步场景用synchronized(简洁、不易出错);高并发、需要灵活控制锁、可中断场景用ReentrantLock。4.volatile关键字的作用答案:volatile是轻量级同步关键字,主要解决可见性、禁止指令重排问题,不保证原子性。1、保证可见性:一个线程修改volatile变量,其他线程可立即感知到最新值,避免变量缓存导致数据不一致;2、禁止指令重排:编译器、CPU不会对volatile修饰的变量指令进行重排序,解决并发场景下的指令乱序问题;3、不保证原子性:复合操作(i++、i+=1)无法保证线程安全,需配合锁使用。常用场景:状态标记量、双重校验锁单例模式。四、JVM与垃圾回收面试题1.JVM内存区域划分答案:JVM运行时数据区分为5大区域,其中线程私有3个、线程共享2个:1、程序计数器(线程私有):记录当前线程执行的字节码行号,唯一无OOM的内存区域。2、虚拟机栈(线程私有):存储局部变量、方法栈帧,方法调用与执行,栈溢出会报StackOverflowError。3、本地方法栈(线程私有):执行native本地方法,与虚拟机栈作用类似。4、堆内存(线程共享):所有对象、数组的存储区域,垃圾回收的核心区域,会发生OOM。分为新生代、老年代。5、方法区(线程共享):存储类信息、常量、静态变量、编译后的代码,JDK1.8后替换为元空间,使用本地内存,减少OOM。2.垃圾回收的判定方式答案:JVM通过两种方式判定对象是否可被回收:1、引用计数法:对象被引用则计数+1,引用失效计数-1,计数为0则回收。弊端:无法解决循环引用问题,主流JVM不再使用。2、可达性分析法(主流):以GCRoots为起点遍历内存,无法遍历到的对象判定为垃圾对象。GCRoots包含:虚拟机栈中引用的对象、静态变量引用对象、常量引用对象、本地方法栈引用对象。3.新生代、老年代垃圾回收机制答案:1、新生代:对象朝生夕灭,分为Eden区、两个Survivor区(8:1:1)。使用复制算法,发生MinorGC,频率高、速度快。存活对象在Survivor区来回转移,年龄达标进入老年代。2、老年代:存储长期存活的大对象,空间占比高、对象存活率高。使用标记清除、标记整理算法,发生MajorGC,频率低、速度慢,耗时远高于MinorGC。4.常见OOM原因及解决方案答案:1、堆内存溢出:创建大量对象未释放、内存泄漏(集合未清空、静态集合常驻内存)。解决方案:优化代码释放无用对象、调整堆内存参数、排查内存泄漏。2、栈内存溢出:方法递归深度过大、大量嵌套调用。解决方案:优化递归逻辑、调整栈大小。3、元空间溢出:加载过多动态类、反射生成大量类。解决方案:调整元空间大小、清理无用类。五、Spring核心面试题1.SpringIOC原理答案:IOC即控制反转,核心是将对象的创建、管理、依赖注入权限交给Spring容器,替代开发者手动new对象,实现解耦。传统开发:开发者主动创建对象、管理依赖(主动控制);IOC模式:容器自动扫描Bean、创建实例、注入依赖,开发者直接使用(被动接收)。核心实现:Bean工厂解析配置类/注解,扫描组件,初始化Bean,存入IOC容器,全程自动管理对象生命周期。2.SpringAOP原理及应用场景答案:AOP即面向切面编程,基于动态代理,在不修改原有业务代码的前提下,对方法进行增强,实现业务与通用逻辑解耦。核心概念:切点(需要增强的方法)、通知(增强逻辑:前置、后置、异常、环绕通知)、切面(切点+通知)。应用场景:日志记录、事务控制、权限校验、性能监控、缓存处理。代理规则:目标类有接口用JDK动态代理,无接口用CGLIB字节码代理。3.SpringBean的生命周期答案:1、实例化:Spring通过反射创建Bean对象;2、属性填充:自动注入依赖属性;3、初始化前置处理:执行Bean后置处理器前置方法;4、初始化:执行InitializingBean、自定义init方法;5、初始化后置处理:执行Bean后置处理器后置方法;6、销毁:容器关闭时,执行DisposableBean、自定义destroy方法。4.Spring事务传播机制答案:事务传播机制用于控制嵌套调用方法时事务的传递规则,常用7种,核心5种:1、REQUIRED(默认):有事务则加入,无则新建事务;2、SUPPORTS:有事务则加入,无则非事务执行;3、MANDATORY:必须在事务内执行,无事务直接报错;4、REQUIRES_NEW:新建独立事务,挂起原有事务;5、NESTED:嵌套事务,依赖父事务,父事务回滚则子事务必回滚,子事务回滚不影响父事务。六、MySQL数据库面试题1.InnoDB和MyISAM的区别答案:1、事务支持:InnoDB支持事务、ACID特性;MyISAM不支持事务。2、锁机制:InnoDB支持行锁、表锁;MyISAM仅支持表锁,并发差。3、崩溃恢复:InnoDB支持事务日志,崩溃可恢复数据;MyISAM崩溃易数据损坏。4、外键:InnoDB支持外键;MyISAM不支持。5、场景:InnoDB是默认引擎,适用于增删改频繁、需要事务的业务;MyISAM适用于静态数据、大量查询、极少修改的场景。2.索引原理及B+树优势答案:MySQL索引底层默认B+树,优势对比二叉树、B树:1、层级更少:B+树分支节点多,树高度低,磁盘IO次数少,查询更快;2、数据集中:所有数据都在叶子节点,非叶子节点仅存索引键,内存占用小;3、有序遍历:叶子节点双向链表串联,范围查询、排序查询效率极高。索引分类:主键索引、唯一索引、普通索引、联合索引、覆盖索引。3.慢查询优化思路答案:1、开启慢查询日志,定位慢SQL;2、explain分析执行计划,查看是否命中索引、是否全表扫描;3、优化索引:为高频查询字段建立索引,避免索引失效(like%开头、or、字段类型转换、notin等);4、优化SQL语句:避免select*、减少子查询、合理分页、避免大事务;5、优化表结构:字段适当拆分、避免大字段、合理分表分库。七、高频手写代码面试题1.双重校验锁单例模式(线程安全)答案:java
publicclassSingleton{
//volatile禁止指令重排,避免半初始化对象
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025入党考试题及答案
- 2025幼儿教师资格证考试《综合素质》真题练习试题A卷附答案
- 2026年二级建造师继续教育考试练习题及答案
- 2026年人工智能训练师(五级)实操考核评分标准及试题
- 人体解剖之脑和脊髓的传导通路
- 肠内营养不耐受的预防及护理考核试题
- 混凝土多轴强度
- 传染病消毒剂配比操作的2025年虚拟实训系统
- 小学信息技术教资面试编程专项题库 2026下半年
- 大尺寸回转窑托轮热处理新工艺的应用
- 上课课件-《食品物流学》(和东芹)
- 传统蒙学在现代儿童德育中的创造性运用研究
- 《椭圆的几何性质》第1课时名师课件
- 国家电网公司招聘高校毕业生应聘登记表
- 青少年心理发展与教育(硕士)
- 林下土鸡养殖技术课件
- 电动卷帘门维修合同范本
- JBT 6434-2024 输油齿轮泵(正式版)
- 油脂制取工艺与设备课件
- 做出判断的分支复习课课件教科版高中信息技术必修1
- 高中美术 人美版 选修《绘画》对话大千世界-绘画创意与实践 第2课时《畅想世界-图画想象力》 课件
评论
0/150
提交评论