版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Java工程师高频面试题及详细答案(真实面试版)一、Java基础核心(高频必问)1.说说==和equals的区别?答案:==是比较运算符,既可以比较基本数据类型,也可以比较引用数据类型。基本类型比较的是数值本身,引用类型比较的是对象的内存地址。equals是Object类的方法,默认情况下和==效果一致,比较对象内存地址。但像String、Integer这类常用类,都重写了equals方法,重写后比较的是对象的内容值,不再比较地址。日常开发中,字符串对比、对象内容对比一律用equals,基本数值对比用==。2.String、StringBuilder、StringBuffer的区别?答案:1、String:字符串常量,不可变。每次拼接、修改字符串都会生成新的String对象,频繁操作会产生大量冗余对象,效率最低。2、StringBuilder:字符串变量,可变、线程不安全,没有加锁,执行效率高,日常单线程字符串拼接优先使用。3、StringBuffer:字符串变量,可变、线程安全,所有方法都加了synchronized锁,多线程场景下保证数据安全,但效率相对较低。使用场景:少量字符串操作用String;单线程大量拼接用StringBuilder;多线程拼接用StringBuffer。3.final、finally、finalize的区别?答案:1、final:是修饰符。修饰变量表示常量,不可二次赋值;修饰方法表示方法不可重写;修饰类表示类不可被继承。2、finally:是异常处理关键字,搭配try-catch使用。代码块中的代码无论是否发生异常、是否return,都会执行,常用于释放资源(关闭流、数据库连接)。3、finalize:是Object类的废弃方法,JVM垃圾回收前会调用该方法,用于对象收尾资源释放。该方法执行时机不确定、无法保证调用,开发中基本不用,已被废弃。4.接口和抽象类的区别?答案:1、定义修饰:抽象类用abstract修饰;接口用interface定义。2、继承实现:类只能单继承一个抽象类;类可以多实现多个接口。3、成员特性:抽象类可以有构造方法、普通成员变量、静态变量、抽象/普通方法;接口没有构造方法,jdk8之前只有抽象方法,jdk8新增默认方法、静态方法,jdk9新增私有方法,成员变量默认是publicstaticfinal常量。4、设计思想:抽象类是模板复用,提取子类公共代码;接口是行为规范,定义统一的功能标准。二、Java集合框架(面试重点)1.ArrayList和LinkedList的区别?答案:1、底层结构:ArrayList基于动态数组;LinkedList基于双向链表。2、查询效率:ArrayList支持下标随机访问,查询速度极快;LinkedList必须从头节点遍历查找,查询效率低。3、增删效率:ArrayList增删元素会涉及数组移位、扩容,效率低;LinkedList只需要修改节点指针,无需移位,首尾增删效率高。4、内存占用:ArrayList会预留扩容空间,存在内存冗余;LinkedList每个节点存储数据和前后指针,单个元素内存占用更大。场景选择:大量查询、少量增删用ArrayList;大量首尾增删、极少查询用LinkedList。2.HashMap的底层原理?JDK1.7和JDK1.8区别?答案:底层核心原理:HashMap基于数组+链表+红黑树实现,通过hash算法计算key的哈希值,确定数组下标,解决哈希冲突后存储键值对。JDK1.7版本:底层是数组+单向链表,采用头插法插入数据,哈希冲突严重时链表过长,查询效率极低;多线程扩容容易出现环形链表,引发死循环。JDK1.8优化:1、底层改为数组+单向链表+红黑树;2、链表长度超过8且数组容量大于64时,链表转为红黑树,提升查询效率;3、改为尾插法,避免多线程扩容环形链表问题;4、优化hash算法,减少哈希冲突概率。核心参数:默认容量16,负载因子0.75,扩容阈值=容量*0.75。3.HashMap和ConcurrentHashMap的区别?答案:1、线程安全:HashMap线程不安全,多线程增删改会出现数据覆盖、死循环问题;ConcurrentHashMap线程安全,是并发场景首选。2、加锁方式:JDK1.7的ConcurrentHashMap采用分段锁,将数组分为多个分段,只锁当前操作分段;JDK1.8放弃分段锁,采用CAS+synchronized锁当前数组节点,锁粒度更细,并发效率更高。3、效率:单线程下HashMap效率更高;多线程并发场景下ConcurrentHashMap远优于HashTable。4、空值支持:HashMap允许key、value为空;ConcurrentHashMap不允许key、value为空。三、多线程与并发1.线程和进程的区别?答案:1、进程是操作系统资源分配的最小单位,线程是CPU调度执行的最小单位。2、一个进程包含多个线程,线程共享进程的堆、方法区资源,每个线程有独立的栈、程序计数器。3、进程之间相互独立,一个进程崩溃不影响其他进程;线程共享资源,一个线程异常崩溃,大概率导致整个进程崩溃。4、进程创建、销毁开销大;线程轻量化,创建销毁开销小,切换效率高。2.synchronized和Lock的区别?答案:1、锁类型:synchronized是内置锁、隐式锁,JVM底层实现;Lock是显示锁,是Java接口(ReentrantLock是实现类),代码层面实现。2、加锁解锁:synchronized自动加锁、自动释放锁,无需手动操作;Lock需要手动lock()加锁、unlock()解锁,必须在finally中解锁,避免死锁。3、锁特性:synchronized不可中断、只能非公平锁、不支持超时;Lock支持可中断锁、超时锁、可实现公平锁,功能更灵活。4、条件等待:synchronized只有一个wait/notify等待唤醒机制;Lock可以绑定多个Condition,精准唤醒指定线程。场景:简单并发场景用synchronized,简洁高效;复杂并发、需要超时、公平锁、精准唤醒用ReentrantLock。3.什么是线程池?核心参数有哪些?答案:线程池是用来统一管理线程的容器,避免频繁创建、销毁线程带来的性能损耗,提高任务处理效率,统一管控线程资源。ThreadPoolExecutor七大核心参数:1、核心线程数:常驻线程,即使空闲也不会被回收;2、最大线程数:线程池能容纳的最大线程数量;3、空闲超时时间:非核心线程空闲多久后被回收;4、时间单位:超时时间的单位;5、任务队列:存储等待执行的任务;6、线程工厂:创建线程的工厂,可自定义线程名称、优先级;7、拒绝策略:任务满负荷后,新任务的处理策略。日常开发规范:禁止使用Executors创建线程池,必须手动newThreadPoolExecutor,明确参数,避免资源耗尽风险。四、JVM虚拟机1.JVM内存区域划分?答案:JVM运行时数据区分为5个部分,其中线程私有3个、线程共享2个:线程私有(随线程创建销毁):1、程序计数器:记录当前线程执行的字节码行号,是唯一没有内存溢出的区域;2、虚拟机栈:存储局部变量、方法参数、方法栈帧,方法调用即入栈,执行结束即出栈;3、本地方法栈:为JNI本地方法服务。线程共享(全局唯一):1、堆内存:所有对象、数组的存储区域,垃圾回收的主要区域;2、方法区:存储类信息、常量、静态变量、即时编译代码等。2.垃圾回收机制(GC)原理?哪些对象会被回收?答案:GC是JVM自动回收堆内存中无有效引用的对象,释放内存空间,避免内存泄漏。判定垃圾对象的方式:1、引用计数法:对象引用次数为0则判定为垃圾,无法解决循环引用问题;2、可达性分析算法(主流):以GCRoots为起点遍历,无法遍历到的对象即为垃圾对象。GCRoots包含:虚拟机栈引用的对象、本地方法栈引用的对象、方法区静态变量/常量引用的对象。回收区域:主要回收堆内存,分为年轻代(频繁GC)、老年代(GC频率低),元空间不参与GC。3.说说CMS和G1垃圾收集器的区别?答案:1、CMS是老年代收集器,基于标记清除算法,主打低停顿,适合响应速度优先的业务;缺点是会产生内存碎片,无法处理浮动垃圾。2、G1是全堆收集器,将堆内存划分为多个大小相等的区域,可单独回收年轻代、老年代,主打可控停顿时间,适合大内存、高并发业务。3、JDK9之后G1成为默认收集器,逐步替代CMS,稳定性和性能更优。五、Spring核心知识点1.SpringIOC原理?答案:IOC即控制反转,核心是把对象的创建、管理、依赖注入权限交给Spring容器,不再由开发者手动new对象。核心流程:1、容器启动,扫描项目注解/配置文件,加载Bean定义信息;2、根据Bean定义,通过反射创建Bean实例;3、自动完成依赖注入、初始化方法执行;4、将完整Bean放入单例池,供全局使用。核心优势:解耦代码,统一管理对象,方便后续AOP、事务等功能扩展。2.SpringAOP的原理和使用场景?答案:AOP即面向切面编程,基于动态代理实现,在不修改原有业务代码的前提下,对方法进行增强。代理规则:目标类有接口用JDK动态代理,无接口用CGLIB字节码代理。核心场景:统一日志记录、权限校验、事务控制、接口限流、性能耗时统计、异常统一处理。核心术语:切点、切面、通知(前置、后置、异常、环绕)、连接点。3.Spring事务传播机制有哪些?常用的是?答案:Spring共7种事务传播机制,日常开发最常用3种:1、REQUIRED(默认):当前有事务就加入,没有就新建事务,最常用;2、SUPPORTS:有事务就加入,没有就非事务运行;3、REQUIRES_NEW:无论当前是否有事务,都新建一个独立事务,暂停原有事务;其余NOT_SUPPORTED、MANDATORY、NEVER、NESTED多用于特殊业务场景。事务失效常见场景:方法非public、内部调用、try-catch捕获异常、传播机制配置错误。六、MySQL数据库1.InnoDB和MyISAM的区别?答案:1、事务支持:InnoDB支持事务,满足ACID;MyISAM不支持事务。2、锁机制:InnoDB支持行锁、表锁,并发性能高;MyISAM只有表锁,增删改会锁全表,并发差。3、崩溃恢复:InnoDB支持事务日志,宕机可恢复数据;MyISAM宕机易数据损坏。4、外键:InnoDB支持外键;MyISAM不支持。5、场景:InnoDB是默认引擎,适合增删改查频繁、需要事务的业务;MyISAM适合静态、大量查询、极少修改的场景。2.索引失效的常见场景?答案:1、索引列使用函数、运算、类型转换;2、like以%开头(%xxx),前缀模糊查询失效;3、or连接无索引字段,导致全表扫描;4、违背最左匹配原则(联合索引跳过最左字段);5、字段隐式类型转换,比如字符串字段传数字;6、MySQL优化器判断全表扫描比索引更快,主动放弃索引。3.什么是MVCC?实现原理?答案:MVCC即多版本并发控制,是InnoDB实现读写不加锁、解决幻读、提升并发性能的核心机制,用于实现可重复读隔离级别。核心原理:通过隐式字段、undolog、readview实现。每条记录隐藏版本号,数据修改时保存历史版本,查询时读取当前事务可见的历史版本,实现无锁读。七、Redis高频面试题1.Redis缓存穿透、击穿、雪崩的解决方案?答案:1、缓存穿透:查询数据库和缓存都不存在的数据,直接打穿数据库。解决方案:缓存空值、布隆过滤器
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025消防安全知识考试考试练习题及答案
- 2025医保知识试题附带答案
- 2025中医医师定期考核专业理论知识考试题库与答案
- 2026年复工复产安全排查培训试题及答案
- 2026年全国安全生产月安全知识练习题及参考答案
- 传染病诊断标准(新)12种-图文
- unit5language-points市公开课获奖课件省名师示范课获奖课件
- 药用牡丹间作套种高产栽培新技术
- 国家消防安全色标准解读
- 大一职业规划模板
- L25J101-2建筑工程做法(下册)
- 2026广东省选调生招录1715人参考考试试题及答案解析
- 行政接待标准操作流程手册
- 普通动物学题库-普通动物学习题及答案
- 设备运输方案及保证措施
- 银行制度写作规范要求
- 村医肺结核培训课件
- 脑膜瘤护理常规讲解
- 精致工艺PQ介绍
- 工程配合费合同范本
- 河南青桐鸣大联考高二上学期2025年10月考试物理试卷
评论
0/150
提交评论