版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Java程序员面试题及详细答案(真实职场版)一、Java基础核心面试题1.==和equals的区别?答案:==是运算符,既可以比较基本数据类型,也可以比较引用数据类型。基本类型比较的是数值本身,引用类型比较的是对象内存地址。equals是Object类的方法,默认情况下和==效果一致,比较的是对象地址。但String、Integer等包装类重写了该方法,重写后只比较内容值,不比较地址。日常开发中,字符串对比必须用equals,避免地址不同导致判断出错。2.String、StringBuilder、StringBuffer的区别?答案:String是不可变字符串,每次拼接、修改都会生成新字符串对象,频繁操作会产生大量垃圾对象,性能最差。StringBuffer和StringBuilder是可变字符串,底层是char数组,修改不会新建对象。核心区别:StringBuffer线程安全,方法加了synchronized锁,性能低;StringBuilder线程不安全,无锁,性能高。实际开发:单线程字符串拼接优先用StringBuilder,多线程共享变量场景用StringBuffer。3.基本数据类型和包装类的区别?自动装箱拆箱原理?答案:基本类型是系统原生数据类型,占用内存小、无对象、无默认null,包含byte、short、int、long、float、double、char、boolean。包装类是基本类型的对象封装,属于引用类型,可以为null,能泛型、能存集合、包含大量工具方法。自动装箱:基本类型自动转为包装类,编译器底层执行Integer.valueOf()方法;自动拆箱:包装类自动转为基本类型,编译器底层执行intValue()等方法。补充:Integer有缓存机制,-128~127范围内的数值,装箱会复用缓存对象,超出范围会新建对象。4.final、finally、finalize的区别?答案:final是修饰符:修饰变量不可修改、修饰方法不可重写、修饰类不可继承。finally是异常处理关键字:搭配try-catch使用,无论代码是否异常、是否return,最终都会执行,常用于关闭流、释放资源。finalize是Object类的废弃方法:JVM垃圾回收前会调用该方法,用来做对象收尾清理,目前已被废弃,不推荐使用。5.接口和抽象类的区别?答案:1.抽象类可以有构造方法、成员变量、普通方法、抽象方法;接口只能有常量、抽象方法(JDK8+支持默认方法、静态方法,JDK9+支持私有方法)。2.抽象类单继承,接口多实现。3.抽象类是模板复用,解决代码复用问题;接口是行为规范,解决多态和约束问题。日常开发:通用代码复用用抽象类,定义功能规范、多场景实现用接口。二、Java集合面试题1.ArrayList和LinkedList的区别?适用场景?答案:ArrayList底层是动态数组,支持随机访问,查询速度极快;增删元素需要移动数组元素,效率低,线程不安全。LinkedList底层是双向链表,无数组扩容、无需移动元素,头尾增删效率高;不支持随机访问,查询需要遍历链表,速度慢。使用场景:查询多、增删少用ArrayList;频繁头尾增删、极少查询用LinkedList。日常业务90%场景优先ArrayList。2.HashMap底层原理?JDK1.7和JDK1.8区别?答案:HashMap底层是「数组+链表+红黑树」,基于哈希表实现,用来存储键值对,key唯一、可存null键null值,线程不安全。存储流程:通过key的hash值计算数组下标,下标位置无元素直接存入;有元素则发生哈希冲突,挂链表;链表长度≥8且数组容量≥64,链表转为红黑树;红黑树节点≤6,退化为链表。JDK1.7vsJDK1.8:1.7是数组+链表,无红黑树,哈希冲突严重时查询效率极低;插入元素用头插法,多线程下容易出现环形链表死循环。1.8新增红黑树结构,优化高冲突场景性能;改为尾插法,避免环形链表;优化hash算法,减少哈希冲突。3.HashMap、HashTable、ConcurrentHashMap区别?答案:HashMap:线程不安全,允许null键null值,效率高,日常单线程首选。HashTable:线程安全,所有方法加全局锁,效率极低,不允许null键值,基本已被淘汰。ConcurrentHashMap:线程安全,分段锁机制(1.7)/CAS+局部锁(1.8),并发效率高,多线程环境存储键值对首选。4.为什么HashMap重写equals必须重写hashCode?答案:HashMap存储逻辑是先判断hashCode,再判断equals。如果只重写equals不重写hashCode,会导致两个内容相同的对象,hashCode值不同,HashMap会判定为两个不同的key,造成重复存储,违背去重逻辑。规范:相等的对象必须hashCode相等,hashCode相等对象不一定相等。三、多线程与并发面试题1.线程和进程的区别?答案:进程是系统资源分配的最小单位,独立占用内存、CPU资源,进程之间相互隔离、开销大。线程是CPU调度的最小单位,隶属于进程,共享进程的资源,切换开销小、效率高。一个进程包含多个线程,多线程可以提升程序并发处理能力,充分利用CPU资源。2.synchronized和Lock的区别?答案:1.synchronized是内置关键字,自动加锁释放锁;Lock是接口,需要手动lock()加锁、unlock()释放锁。2.synchronized阻塞等待不可中断;Lock可以响应中断、可超时等待,灵活性更高。3.synchronized是悲观锁、独占锁;ReentrantLock可实现公平锁、非公平锁,支持可重入。4.底层:synchronized依赖JVM底层实现;Lock是代码层面CAS实现。日常:简单同步用synchronized,需要超时、公平锁、中断场景用Lock。3.volatile关键字的作用?能保证线程安全吗?答案:volatile核心两个作用:保证可见性、禁止指令重排。可见性:一个线程修改变量,其他线程立刻可见最新值,避免缓存过期。禁止重排:防止JVM编译优化打乱代码执行顺序,常用于单例模式双重校验锁。volatile不能保证原子性,像i++这种复合操作,无法保证线程安全,只能配合锁使用。4.线程池核心参数?核心工作原理?答案:核心参数:核心线程数、最大线程数、空闲超时时间、任务队列、拒绝策略、线程工厂。工作流程:1.新任务进来,线程数小于核心线程数,新建核心线程执行任务;2.核心线程已满,任务加入阻塞队列;3.队列已满,线程数小于最大线程数,新建非核心线程执行任务;4.线程数达到最大值、队列已满,触发拒绝策略。实际开发禁止使用Executors创建线程池,必须手动自定义参数,避免OOM。四、JVM面试题1.JVM内存区域划分?各区域作用?答案:1.程序计数器:线程私有,记录当前线程执行的字节码行号,唯一无OOM的区域。2.虚拟机栈:线程私有,存储局部变量、方法栈帧,方法调用与执行,栈深过大报栈溢出。3.本地方法栈:线程私有,执行native本地方法。4.堆内存:线程共享,所有对象、数组的存储区域,GC主要回收区域,频繁OOM。5.方法区(元空间):线程共享,存储类信息、常量、静态变量、编译后的代码。2.垃圾回收机制?GC回收哪些内存?答案:GC主要回收堆内存和方法区无用对象,栈、计数器、本地方法栈随线程结束自动释放,无需GC。垃圾判定:主流可达性分析算法,从GC根节点遍历,不可到达的对象判定为垃圾对象。回收算法:标记清除、标记复制、标记整理。新生代多用标记复制,老年代多用标记清除+整理。3.MinorGC、MajorGC、FullGC区别?答案:MinorGC:新生代垃圾回收,频率高、速度快,不会暂停老年代。MajorGC:老年代垃圾回收,速度慢、耗时久。FullGC:整堆回收(新生代+老年代+元空间),暂停所有用户线程,性能开销极大,线上必须尽量避免。五、Spring核心面试题1.SpringIOC原理?答案:IOC控制反转,就是把对象的创建、管理、依赖注入交给Spring容器,不再由开发者手动new对象。核心流程:启动项目扫描注解/配置文件→加载Bean定义→实例化Bean→依赖注入→初始化Bean→存入容器,随项目运行使用,项目关闭销毁Bean。核心作用:解耦,统一管理对象,方便扩展和维护。2.SpringAOP原理?应用场景?答案:AOP面向切面编程,基于动态代理,在不修改原有业务代码的前提下,对方法进行增强。底层:目标类有接口用JDK动态代理,无接口用CGLIB字节码增强代理。应用场景:日志记录、权限校验、事务控制、接口限流、性能监控、异常统一处理。3.SpringBean生命周期?答案:1.实例化:容器创建Bean对象;2.属性填充:自动注入依赖属性;3.初始化:执行前置处理、初始化方法、后置处理;4.就绪使用:Bean存入容器,供业务调用;5.销毁:项目关闭,执行销毁方法释放资源。4.Spring事务传播机制、隔离级别?答案:传播机制(常用):REQUIRED:默认,有事务加入,无事务新建;SUPPORTS:有事务加入,无事务非事务运行;REQUIRES_NEW:新开独立事务,暂停原有事务;NESTED:嵌套事务,依赖父事务,可单独回滚子事务。隔离级别:读未提交、读已提交、可重复读、串行化。MySQL默认可重复读,能解决大部分幻读、脏读问题。六、MySQL数据库面试题1.InnoDB和MyISAM区别?答案:InnoDB:支持事务、行锁、外键、崩溃恢复,支持MVCC,并发性能高,默认存储引擎,适合业务读写表。MyISAM:不支持事务、行锁,只有表锁,崩溃无法恢复,查询速度快,适合静态只读数据表,基本不再使用。2.索引失效场景有哪些?答案:1.模糊查询左模糊、全模糊(%xxx、%xxx%);2.索引列参与运算、函数操作;3.字符串字段不加引号,隐式类型转换;4.使用or连接无索引字段;5.违反最左前缀原则;6.使用!=、<>、isnotnull;7.数据量过大,MySQL判定全表扫描更快,主动放弃索引。3.MVCC原理?答案:MVCC多版本并发控制,是InnoDB实现读写不加锁、提升并发性能的核心机制,主要用于解决可重复读隔离级别下的并发问题。核心依靠:隐藏字段、undolog、readview。每次修改数据都会生成旧版本数据存入undolog,读操作读取历史快照版本,写操作操作最新版本,实现读写互不阻塞,极大提升数据库并发能力。4.什么是脏读、不可重复读、幻读?怎么解决?答案:脏读:读取到其他事务未提交的脏数据;不可重复读:同一事务内,两次查询同一数据结果不一致;幻读:同一事务内,范围查询数据条数新增或减少。解决:读已提交解决脏读;可重复读解决脏读、不可重复读;串行化解决所有问题,但性能最低。七、Redis面试题(后端必备)1.Redis为什么快?答案:1.纯内存操作,无需磁盘IO;2.单线程模型,无线程切换、锁竞争开销;3.IO多路复用,高效处理大量并发连接;4.数据结构设计精简,底层编码优化。2.Redis缓存穿透、击穿、雪崩解决方案?答案:缓存穿透:查询不存在的数据,绕过缓存直查数据库。解决:布隆过滤器、空值缓存、接口校验。缓存击穿:热点key过期,大量请求打垮数据库。解决:互斥锁、热点key永不过期。缓存雪崩:大量key同时过期/Redis宕机,流量全部打入数据库。解决:过期时间加随机值、集群高可用、限流降级、多级缓存。八、真实业务场景面试题1.线上接口响应慢
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 医生绩效考核病患治愈率考评表
- 升压站变电站保护及自动化调试方案
- 办公文档修订与版本管理规范
- 食堂餐饮设备操作与管理指南
- 航空行业飞行训练模拟系统方案
- 项目协调员项目周期与成本控制绩效评价表
- 酒店前台接待员酒店业绩效评定表
- 数字内容平台用户内容生产全流程指南
- (2026年)静脉输液考试试题及答案
- 零售业店长门店销售与员工管理KPI考核表
- 2026国考行测真题及参考答案
- 2026中国放射性废水处理用陶瓷超滤膜辐照稳定性加速测试报告
- 2026秋统编版(新教材)七年级道德与法治上册易错知识点梳理+分课填空自测练习题及答案
- 四上2-3《呼吸的变化》教学课件
- 2026年中盐榆林盐化有限公司秋季招聘笔试模拟试题及答案详解
- 2025年信息安全工程师考试真题及答案解析
- 2026年压力容器考试题库及答案
- BJS 202602 食品中伐地那非杂质30的测定
- 2026年广东省中考物理试卷附答案
- 2026年新闻记者职业资格考试新闻采编实务试卷及答案解析
- 2026年初级注册安全工程师《安全生产法律法规》真题(附答案解析)
评论
0/150
提交评论