版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
BAT高频Java面试题及详细答案(实战完整版)一、Java基础核心面试题1、==和equals的区别是什么?这是面试最基础的必考题,核心区分比较对象不同:==是运算符,有两种作用:基本数据类型比较的是数值是否相等;引用数据类型比较的是内存地址是否相同,也就是判断是不是同一个对象。equals是Object类的方法,默认情况下和==效果一致,比较对象内存地址。但像String、Integer、自定义实体类都会重写该方法,重写后只比较对象内容/属性值,不比较内存地址。实战总结:日常开发中,字符串对比必须用equals,基本类型用==,避免空指针的前提下优先使用常量.equals(变量)。2、String、StringBuilder、StringBuffer的区别?1)可变性String是不可变字符串,每次赋值、拼接都会生成新的字符串对象,频繁操作会产生大量垃圾对象。StringBuilder和StringBuffer是可变字符串,底层是char数组(JDK1.9+改为byte数组),修改内容不会新建对象。2)线程安全StringBuffer所有方法都加了synchronized锁,线程安全,多线程环境可用;StringBuilder无锁,线程不安全,单线程场景性能更高。3)使用场景少量字符串拼接、常量定义用String;单线程大量拼接、循环拼接用StringBuilder;多线程并发拼接场景用StringBuffer。3、final、finally、finalize的区别?final:修饰符修饰变量:变量变为常量,赋值后不可修改;修饰方法:方法不可重写;修饰类:类不可被继承。finally:异常处理关键字搭配try-catch使用,代码块一定会执行(除了系统退出、断电极端情况),主要用于释放资源,比如关闭流、关闭数据库连接。finalize:Object类废弃方法JVM垃圾回收前会调用该方法,用于对象资源回收。该方法执行时机不确定、效率极低,JDK9之后已被废弃,开发中绝对不使用。4、接口和抽象类的区别?1)定义与修饰符抽象类用abstract修饰,可以有构造方法、普通成员变量、静态变量;接口默认是public,JDK1.8之前只有抽象方法,1.8支持默认方法、静态方法,1.9支持私有方法,没有构造方法,变量默认是publicstaticfinal常量。2)继承与实现抽象类只能单继承;接口可以多实现,解决单继承局限。3)设计思想抽象类是模板复用,抽取子类通用属性和行为;接口是行为规范,定义统一的功能标准,不关心具体实现。二、Java集合高频面试题1、ArrayList和LinkedList的区别?底层结构:ArrayList基于动态数组;LinkedList基于双向链表。查询效率:ArrayList支持随机访问,通过下标查询速度极快;LinkedList必须从头遍历,查询效率低。增删效率:ArrayList中间增删需要移动数组元素,效率低;尾部增删效率高;LinkedList任意位置增删只需要修改节点指针,无需移动元素,频繁增删场景更优。内存占用:ArrayList会预留扩容空间,存在内存冗余;LinkedList每个节点保存前后指针,单个元素占用内存更大。实战场景:日常开发90%场景用ArrayList,只有频繁中间增删的场景才用LinkedList。2、HashMap的底层原理?JDK1.7和JDK1.8区别?底层核心原理HashMap基于数组+链表+红黑树实现,通过hash算法计算元素下标,解决hash冲突后存储数据,支持快速增删改查。JDK1.7底层:数组+单向链表,采用头插法,链表过长不会树化,存在环形链表死循环问题(多线程扩容)。JDK1.8核心优化1、数据结构优化:数组+单向链表+红黑树,链表长度超过8、数组容量大于64时,链表转为红黑树,查询时间复杂度从O(n)降为O(logn);2、插入方式改为尾插法,避免多线程扩容产生环形链表;3、优化hash算法,减少hash冲突概率;4、扩容时机、阈值计算逻辑优化,性能大幅提升。3、HashMap为什么线程不安全?怎么解决?不安全场景:多线程同时put数据、扩容时,会出现数据覆盖、丢失、环形链表导致CPU100%、死循环等问题。解决方案1、使用Hashtable:全局加锁,线程安全但并发性能极差,基本不用;2、使用Collections.synchronizedMap:包装HashMap,方法加锁,并发性能一般;3、推荐使用ConcurrentHashMap:分段锁思想(1.7)、CAS+synchronized锁节点(1.8),并发性能极高,生产环境首选。三、多线程与并发面试题1、线程和进程的区别?进程:操作系统资源分配的最小单位,独立占用内存、CPU资源,进程之间相互隔离,切换开销大。线程:进程内的执行单元,CPU调度的最小单位,共享进程的内存资源,线程间切换开销小、通信方便。一个进程至少包含一个线程,多线程是在一个进程内并发执行多个任务,提升程序运行效率。2、synchronized和Lock的区别?1)锁类型synchronized是JVM底层实现的内置锁,自动加锁解锁;Lock是Java代码层面的显式锁,需要手动lock()加锁、unlock()解锁。2)功能灵活性synchronized无法中断等待锁的线程,不支持超时锁、读写锁;Lock(ReentrantLock)支持可中断锁、超时锁、公平锁、读写锁,功能更丰富。3)性能JDK1.6之后synchronized做了大量优化(偏向锁、轻量级锁、重量级锁、锁升级),性能和ReentrantLock基本持平;低版本JDK中Lock性能更好。实战建议:简单同步场景用synchronized,需要精细控制锁的场景用ReentrantLock。3、volatile关键字的作用?能保证线程安全吗?volatile核心两个作用:保证可见性、禁止指令重排。1、可见性:一个线程修改volatile变量,其他线程能立刻感知到最新值,避免变量缓存导致的数据不一致;2、禁止重排:防止JVM和CPU为了优化性能打乱代码执行顺序,常用于单例模式双重校验锁。不能保证原子性:volatile不保证复合操作(i++、赋值运算)的原子性,所以无法保证线程安全。需要原子操作可使用Atomic原子类。四、JVM核心面试题(BAT重点)1、JVM内存区域划分?各自作用?JVM运行时数据区分为5个区域:1)程序计数器:线程私有,记录当前线程执行的字节码行号,唯一没有内存溢出的区域。2)虚拟机栈:线程私有,存储局部变量、方法栈帧、操作数栈,方法执行时创建栈帧,执行结束销毁,栈深度过大报StackOverflowError。3)本地方法栈:线程私有,服务于Native本地方法,作用和虚拟机栈类似。4)堆内存:线程共享,所有对象、数组都在堆中分配,是垃圾回收的主要区域,内存不足报OOM。分为新生代、老年代、元空间(JDK1.8)。5)方法区:线程共享,存储类信息、常量、静态变量、即时编译代码,JDK1.8彻底废弃永久代,改用元空间,使用本地内存,不再占用JVM堆内存。2、GC垃圾回收机制?MinorGC、FullGC区别?垃圾回收核心思想:自动回收堆中没有引用指向的无效对象,释放内存,无需手动释放。MinorGC:针对新生代的垃圾回收,频率高、速度快,触发条件是新生代内存不足,采用复制算法,停顿时间短,对业务影响小。FullGC:针对整个堆(新生代+老年代+元空间)的全局回收,频率低、速度慢、停顿时间长。触发场景:老年代内存不足、显式调用System.gc()、MinorGC后晋升对象过多、元空间不足。生产环境要尽量避免FullGC,频繁FullGC会导致系统卡顿、接口超时。3、对象创建与销毁过程?对象存活判定?对象存活判定:JVM采用可达性分析算法,以GCRoots为起点遍历,能遍历到的对象存活,无法遍历的对象判定为垃圾对象。GCRoots包含:虚拟机栈本地变量、静态变量、常量、本地方法栈引用对象。对象销毁过程:对象判定为垃圾后,标记阶段标记垃圾对象,清理阶段回收内存,对象被回收前若有重写finalize方法会执行一次(不推荐依赖),之后彻底销毁。五、Spring核心面试题1、SpringIOC原理?IOC即控制反转,核心是将对象的创建、管理、依赖注入权限交给Spring容器,告别手动new对象。核心流程:项目启动时,Spring扫描指定包下的注解类(@Component、@Service、@Controller),解析配置,通过反射创建Bean对象,存入IOC容器(Map结构),程序使用时直接从容器获取Bean,实现解耦。DI依赖注入:IOC的核心实现,Spring自动为Bean注入依赖的对象,无需手动赋值,常用方式:构造器注入、setter注入、注解注入。2、SpringAOP原理及使用场景?AOP面向切面编程,核心是在不修改原有业务代码的前提下,对方法进行增强,基于动态代理实现。底层实现:目标类有接口用JDK动态代理,无接口用CGLIB字节码增强代理。常用场景:日志记录、权限校验、事务控制、接口限流、性能监控、缓存处理,统一处理通用逻辑,减少代码冗余。核心注解:@Aspect、@Before、@After、@Around、@Pointcut。3、SpringBean的生命周期?1、实例化:Spring通过反射创建Bean实例;2、属性填充:完成依赖注入,给Bean的属性赋值;3、初始化前置处理:执行BeanPostProcessor前置方法;4、初始化:执行InitializingBean方法、自定义init方法;5、初始化后置处理:执行BeanPostProcessor后置方法;6、销毁:容器关闭时,执行DisposableBean方法、自定义destroy方法。六、MySQL数据库面试题1、InnoDB和MyISAM引擎区别?事务支持:InnoDB支持事务、ACID特性;MyISAM不支持事务。锁机制:InnoDB支持行锁、表锁,默认行锁,并发性能高;MyISAM只有表锁,并发读写互斥,性能差。崩溃恢复:InnoDB支持事务日志,宕机可恢复数据;MyISAM宕机易数据损坏。外键:InnoDB支持外键;MyISAM不支持。实战选择:生产环境全部使用InnoDB,MyISAM基本淘汰,仅用于静态只读数据表。2、索引失效的常见场景?1、索引列使用函数、运算、类型转换;2、like以%开头(%xxx),前置模糊查询失效;3、or连接无索引字段,导致全表扫描;4、联合索引不遵循最左匹配原则;5、字段隐式类型转换,比如字符串字段传数字;6、MySQL优化器判断全表扫描比索引更快,主动放弃索引。3、事务四大特性与隔离级别?四大特性ACID原子性:事务要么全部成功,要么全部回滚;一致性:事务执行前后数据完整性一致;隔离性:多个事务之间相互隔离,互不干扰;持久性:事务提交后,数据永久落地,宕机不丢失。四大隔离级别(从低到高)读未提交:可读取未提交数据,存在脏读、不可重复读、幻读;读已提交(MySQL默认):解决脏读,存在不可重复读、幻读;可重复读:解决脏读、不可重复读,存在幻读;串行化:最高级别,全部问题都解决,但是并发性能极低。七、Redis高频面试题1、Redis为什么快?1、基于内存操作,没有磁盘IO开销,读写速度远超数据库;2、单线程模型,避免多线程锁竞争、线程切换开销;3、IO多路复用模型,单线程高效处理大量客户端连接;4、数据结构设计高效,底层编码优化,内存占用低;5、简单的协议设计,网络传输开销小。2、Redis缓存穿透、击穿、雪崩解决方案?缓存穿透:查询不存在的数据,直接打到数据库。解决:缓存空值、布隆过滤器、接口参数校验。缓存击穿:热点key过期,瞬间大量请求打到数据库。解决:热点key永不过期、互斥锁、定时预热刷新缓存。缓存雪崩:大量key同时过期/Redis宕机,大量请求压垮数据库。解决:过期时间随机打散、Redis集群高可用、服务熔断降级、多级缓存。八、微服务与分布式面试题1、分布式事务解决方案?1、本地消息表:基于本地事务+消息重试,实现最终
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 医疗岗2026事业单位面试例题试卷附解析
- 项目管理知识库建设与应用指南
- 2026年技术升级项目实施进度催告函(8篇)范文
- 2026下半年小学英语教资面试语法专项真题演练试卷
- 2026下半年初中物理教资面试光学结构化题库
- 软件工程师系统实现与代码规范考核表
- 市场部营销计划执行指导书
- 电商智能客服部署手册
- 人力资源行业招聘顾问人才筛选与招聘效果KPI考核表
- 化妆品市场拓展与推广效能评估表
- GB/T 46832-2025塑料磨料磨损性能的测定往复线性滑动法
- 完整的包装设计汇报
- 中医考核人文试题及答案
- 2025年河北西学中题库及答案
- 班主任职业能力大赛课件
- 中试基地管理制度
- 传统蒙学在现代儿童德育中的创造性运用研究
- 国家电网公司招聘高校毕业生应聘登记表
- 青少年心理发展与教育(硕士)
- 林下土鸡养殖技术课件
- 电动卷帘门维修合同范本
评论
0/150
提交评论