Java服务端高频面试题及详细答案(实战版)_第1页
Java服务端高频面试题及详细答案(实战版)_第2页
Java服务端高频面试题及详细答案(实战版)_第3页
Java服务端高频面试题及详细答案(实战版)_第4页
Java服务端高频面试题及详细答案(实战版)_第5页
已阅读5页,还剩5页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Java服务端高频面试题及详细答案(实战版)一、Java基础核心1.==和equals的区别答案:==是比较运算符,对于基本数据类型,比较的是数值本身;对于引用类型,比较的是对象的内存地址。equals是Object类的方法,默认情况下和==效果一致,比较对象地址。但像String、Integer这类包装类和字符串类,重写了equals方法,重写后只比较对象的内容值,不比较地址。日常开发中,判断字符串、包装类内容是否一致,一律用equals;基本类型判断相等用==。2.String、StringBuilder、StringBuffer的区别答案:1、String:字符串常量,不可变。每次拼接、修改字符串都会生成新的String对象,频繁操作会产生大量无用对象,占用内存、降低效率。2、StringBuilder:可变字符串,线程不安全,效率高。适用于单线程下大量字符串拼接场景。3、StringBuffer:可变字符串,线程安全(所有方法加了synchronized锁),效率低。适用于多线程下字符串拼接场景。实战总结:绝大多数业务场景优先用StringBuilder,多线程共享字符串变量时用StringBuffer,固定不变的文本用String。3.final、finally、finalize的区别答案:1、final:修饰符。修饰变量则变量不可二次赋值;修饰方法则方法不能重写;修饰类则类不能被继承。2、finally:异常处理关键字。搭配try-catch使用,代码一定会执行(除了System.exit(0)退出程序、断电等极端情况),主要用于释放资源,比如关闭流、关闭连接。3、finalize:Object类的废弃方法。JVM垃圾回收前会调用该方法,用于对象资源回收,不确定性极强,现在开发中完全不推荐使用,已经被废弃。4.接口和抽象类的区别答案:1、定义区别:抽象类用abstract修饰,接口用interface定义。2、继承区别:类只能单继承抽象类,但可以多实现接口。3、成员区别:抽象类可以有构造方法、成员变量、普通方法、抽象方法;接口(JDK8之前)只能有常量和抽象方法,JDK8后支持默认方法、静态方法,JDK9支持私有方法。4、设计思想:抽象类是is-a关系,是对事物的抽象;接口是has-a关系,是对行为、能力的抽象。实战用法:需要定义通用属性、构造逻辑、模板方法用抽象类;需要定义统一行为规范、多模块解耦用接口。二、Java集合框架1.ArrayList和LinkedList的区别答案:1、底层结构:ArrayList基于动态数组;LinkedList基于双向链表。2、查询效率:ArrayList支持随机访问,通过下标查询速度极快;LinkedList只能从头节点或尾节点遍历查询,效率低。3、增删效率:ArrayList中间增删元素需要移动数组元素,效率低;LinkedList只需修改节点指针,无需移动元素,首尾增删效率高。4、内存占用:ArrayList会预留扩容空间,存在内存冗余;LinkedList每个节点保存数据和前后指针,单个元素占用内存更大。实战选择:查询多、增删少用ArrayList;频繁首尾增删、极少查询用LinkedList。2.HashMap的底层原理(高频)答案:JDK1.8及以上HashMap底层是数组+链表+红黑树结构。1、存储逻辑:通过key的hash值计算数组下标,确定元素存储位置。2、哈希冲突:不同key算出相同下标时,发生哈希冲突,此时在数组对应位置生成链表,挂载冲突元素。3、树化规则:当链表长度大于等于8,且数组容量大于等于64时,链表转为红黑树,提升查询效率;当红黑树节点数量小于等于6时,退化为链表。4、扩容机制:默认初始容量16,负载因子0.75,当元素数量达到容量*负载因子时触发扩容,容量翻倍,重新哈希分配元素位置。5、线程问题:HashMap线程不安全,多线程并发put操作可能出现数据覆盖、链表成环、数据丢失问题。3.HashMap和ConcurrentHashMap的区别答案:1、线程安全:HashMap线程不安全;ConcurrentHashMap线程安全,是并发场景首选。2、加锁方式:JDK1.8的ConcurrentHashMap采用CAS+synchronized锁,只锁定当前数组下标位置的头节点,锁粒度极小,并发效率高。摒弃了JDK1.7的分段锁机制。3、空值支持:HashMap允许key、value为空;ConcurrentHashMap的key和value都不允许为空,会直接抛空指针异常。4、适用场景:HashMap用于单线程场景;ConcurrentHashMap用于多线程并发读写场景。三、JVM与垃圾回收1.JVM内存区域划分答案:JVM运行时数据区分为5个部分:1、程序计数器:线程私有,记录当前线程执行的字节码行号,是唯一没有内存溢出的区域。2、虚拟机栈:线程私有,存储栈帧、局部变量、方法参数、返回值,方法调用和执行都依赖栈,栈深度过大会抛出StackOverflowError。3、本地方法栈:线程私有,作用和虚拟机栈类似,专门为JNI本地方法服务。4、堆内存:线程共享,所有对象、数组都在堆中分配,是垃圾回收的主要区域,也是最容易发生OOM的区域。分为新生代、老年代。5、方法区:线程共享,存储类信息、常量、静态变量、即时编译代码等,JDK1.8后用元空间实现,使用本地内存,不再占用堆内存。2.垃圾回收的判定方法答案:1、引用计数法:给对象添加引用计数器,有引用则计数+1,引用失效则计数-1,计数为0则判定为可回收。缺点是无法解决循环引用问题,主流JVM不再使用。2、可达性分析法(JVM默认):以GCRoots作为起始节点,遍历内存对象,能遍历到的对象是存活对象,没有遍历到的对象判定为垃圾对象,可被回收。GCRoots包含对象:虚拟机栈中引用的对象、静态变量引用对象、常量引用对象、本地方法栈引用对象。3.新生代和老年代垃圾回收机制答案:1、新生代:对象大多朝生夕灭,分为Eden区、两个Survivor区(S0、S1)。默认比例8:1:1。使用复制算法。流程:新对象分配在Eden区,Eden满触发MinorGC,将存活对象复制到空闲的Survivor区,清空Eden和另一个Survivor,反复轮换。存活多次的对象晋升到老年代。2、老年代:存放长期存活的大对象、晋升对象,对象存活率高。使用标记整理算法。触发MajorGC,速度远慢于MinorGC,频繁MajorGC是系统卡顿的重要原因。3、FullGC:整堆回收,包含新生代、老年代、元空间,开销极大,开发中尽量避免。4.常见OOM原因及解决思路答案:常见场景:1、堆内存溢出:创建大量大对象、集合无限扩容、静态集合常驻内存、内存泄漏。2、栈内存溢出:递归死循环、方法嵌套调用过深。3、元空间溢出:动态生成大量类、频繁热部署。排查思路:导出堆快照,用MAT工具分析大对象、泄漏对象;查看GC日志,分析GC频率和耗时;排查代码中无限循环、未关闭资源、集合未清空等问题;合理调整JVM参数。四、多线程与并发1.线程的生命周期答案:Java线程分为6种状态:1、新建(NEW):创建线程对象,未调用start()。2、就绪(RUNNABLE):调用start(),等待CPU调度执行。3、运行(RUNNING):CPU分配时间片,线程正在执行代码。4、阻塞(BLOCKED):等待获取同步锁,锁被其他线程占用时进入阻塞。7、终止(TERMINATED):线程代码执行完毕,线程结束。2.synchronized和Lock的区别答案:1、底层层面:synchronized是JVM原生关键字,底层由虚拟机实现;Lock是Java接口,基于代码层面实现锁机制。2、锁特性:synchronized是隐式锁,自动加锁、自动释放锁;Lock是显式锁,需要手动lock()加锁、unlock()释放锁。3、灵活性:Lock支持可中断锁、超时锁、公平锁、读写锁,功能更丰富;synchronized只能是非公平锁,功能单一。4、性能:高并发场景下Lock性能优于synchronized;低并发场景两者差距不大。实战选择:简单同步场景用synchronized,代码简洁不易出错;高并发、需要精细控制锁逻辑用Lock。3.volatile关键字的作用答案:volatile是轻量级同步关键字,核心两个作用:1、保证可见性:一个线程修改volatile变量,其他线程能立刻感知到最新值,解决变量缓存导致的可见性问题。2、禁止指令重排:避免编译器、CPU对代码指令乱序执行,解决并发场景的重排安全问题。注意:volatile不保证原子性,无法解决i++这类复合操作的线程安全问题,需要配合锁或原子类使用。4.线程池的核心参数和工作原理答案:核心7大参数:核心线程数、最大线程数、空闲线程存活时间、时间单位、任务队列、线程工厂、拒绝策略。工作流程:1、提交任务,判断当前线程数是否小于核心线程数,是则新建核心线程执行任务。2、核心线程已满,任务加入阻塞队列排队。3、队列已满,判断线程数是否小于最大线程数,是则新建非核心线程执行任务。4、线程数达到最大值且队列已满,触发拒绝策略拒绝任务。实战建议:生产环境禁止使用Executors创建线程池,必须手动通过ThreadPoolExecutor自定义参数,避免内存溢出、任务堆积问题。五、Spring核心1.SpringIOC原理答案:IOC即控制反转,核心是把对象的创建、管理、依赖注入权限交给Spring容器,不再由开发者手动new对象。执行流程:项目启动时,Spring扫描指定包下的注解类(@Component、@Service、@Controller等),解析配置,通过反射创建Bean对象,存入IOC容器缓存。后续需要使用对象时,直接从容器中获取,自动完成依赖注入。核心优势:解耦,统一管理对象,方便后续AOP、事务、拦截等功能扩展。2.SpringAOP原理及应用场景答案:AOP面向切面编程,核心是在不修改原有业务代码的前提下,对方法进行增强。底层基于动态代理实现:目标类有接口则用JDK动态代理,无接口则用CGLIB动态代理。核心概念:切点、通知(前置、后置、异常、环绕、最终通知)、切面。常见应用场景:统一日志记录、统一权限校验、事务控制、接口耗时统计、限流、缓存拦截。3.Spring事务传播机制和隔离级别答案:传播机制(常用):1、REQUIRED:默认级别,有事务就加入,无事务新建事务。最常用。2、SUPPORTS:支持事务,有则加入,无则非事务执行。3、REQUIRES_NEW:新建独立事务,暂停原有事务。4、NESTED:嵌套事务,依赖父事务,父事务回滚则子事务必回滚,子事务回滚不影响父事务。隔离级别:1、READ_UNCOMMITTED:读未提交,存在脏读、不可重复读、幻读。2、READ_COMMITTED:读已提交(Oracle默认),解决脏读,存在不可重复读、幻读。3、REPEATABLE_READ:可重复读(MySQL默认),解决脏读、不可重复读,存在幻读。4、SERIALIZABLE:串行化,解决所有并发问题,性能最低。4.SpringBean的生命周期答案:1、实例化:Spring通过反射创建Bean实例。2、属性填充:自动完成依赖注入,给Bean的属性赋值。3、初始化:执行前置处理、初始化方法(afterPropertiesSet、自定义init方法)、后置处理。4、销毁:容器关闭时,执行Bean的销毁方法。单例Bean在容器启动时初始化,容器关闭时销毁;多例Bean每次获取时创建,容器不负责销毁。六、MySQL数据库1.InnoDB和MyISAM的区别答案:1、事务支持:InnoDB支持事务、ACID;MyISAM不支持事务。2、锁机制:InnoDB支持行级锁、表级锁;MyISAM只有表级锁,并发性能差。3、崩溃恢复:InnoDB支持事务日志,崩溃可恢复数据;MyISAM崩溃易数据损坏。4、外键:InnoDB支持外键;MyISAM不支持。5、性能:MyISAM查询速度快,适合纯读场景;InnoDB读写均衡,支持并发读写。实战选择:业务系统99%场景用InnoDB,只有纯静态只读、无更新的场景可考虑MyISAM。2.索引底层原理、B+树优势答案:MySQLInnoDB索引底层采用B+树结构。B+树优势:1、所有数据都在叶子节点,非叶子节点只存索引键,内存占用小,磁盘IO次数少,查询效率高。2、所有叶子节点通过链表串联,范围查询、排序、分页查询效率极高。3、树的层级低,数据量大的情况下,查询稳定性远优于二叉树。3.聚簇索引和非聚簇索引区别答案:1、聚簇索引:主键索引,叶子节点存储整行完整数据,一张表只有一个聚簇索引。2、非聚簇索引(二级索引):普通索引、唯一索引,叶子节点只存储索引字段+主键值,不存完整数据。回表查询:通过二级索引查询数据时,先拿到主键,再通过主键索引查询完整数据,这个过程叫回表,会损耗性能。覆盖索引可以避免回表。4.慢SQL优化思路答案:1、先用explain分析执行计划,查看是否命中索引、是否全表扫描、是否存在临时表、文件排序。2、建立合理索引:高频查询字段、条件字段、排序分组字段建索引;避免过度索引。3、避免索引失效:不使用select*、不在索引列做函数运算、不使用!=、notin、or导致索引失效。4、优化分页:深分页用limit偏移优化、主键分页。5、大表优化:分库分表、冷热数据分离、定时归档历史数据。6、优化业务逻辑:减少关联查询、避免循环查询数据库、批量操作替代单条循环操作。七、Redis缓存1.Redis为什么快答案:1、基于内存操作,所有数据读写都在内存,无磁盘IO开销。2、单线程模型,避免多线程竞争锁、上下文切换的开销。3、数据结构简单高效,底层编码优化,适配不同数据场景。4、采用IO多路复用模型,单线程可处理大量客户端连接请求。2.缓存三大问题及解决方案答案:1、缓存穿透:查询数据库和缓存都不存在的数据,大量请求直接打透到数据库。解决:缓存空值、布隆过滤器、接口参数校验。2、缓存击穿:热点key缓存过期,瞬间大量请求直达数据库。解决:互斥锁、热点key永不过期、后台定时预热刷新缓存。3、缓存雪崩:大量缓存key同时过期,或Redis宕机,导致大量请求直达数据库,压垮数据库。解决:过期时间加随

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论