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

下载本文档

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

文档简介

Java服务器开发高频面试题及详细答案(实战版)一、Java基础核心1.==和equals的区别?答案:1)==是运算符,可以比较基本类型和引用类型:-基本类型:比较数值是否相等;-引用类型:比较对象的内存地址是否相同。2)equals是Object类方法,仅用于引用类型对比:-原生Object的equals方法本质和==一致,也是比较地址;-String、Integer等包装类重写了equals,会直接对比对象的内容数据,而非地址。实战总结:日常开发中,字符串对比一律用equals,基本类型用==,空字符串优先判空再对比,避免空指针。2.String、StringBuilder、StringBuffer的区别?答案:1)String:不可变字符串,底层是final修饰的字符数组。每次拼接、修改都会生成新字符串对象,频繁操作会产生大量垃圾对象,效率最低。2)StringBuilder:可变字符串,线程不安全,无锁,执行效率高,单线程字符串拼接首选。3)StringBuffer:可变字符串,方法加了synchronized锁,线程安全,多线程环境下可使用,效率低于StringBuilder。开发规范:绝大多数业务场景用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支持私有方法;4)设计思想:抽象类是模板复用,抽取子类公共代码;接口是行为规范,定义统一功能标准。实战场景:需要复用代码、统一父类逻辑用抽象类;需要定义统一接口规范、多模块实现用接口。二、Java集合框架1.ArrayList和LinkedList的区别?答案:1)底层结构:ArrayList基于动态数组,LinkedList基于双向链表;2)查询效率:ArrayList支持随机索引访问,查询速度极快;LinkedList必须从头遍历,查询效率低;3)增删效率:ArrayList尾部增删快,中间、头部增删需要移动数组元素,效率低;LinkedList任意位置增删只需修改节点指针,无需移动元素,效率更高;4)内存占用:ArrayList会预留扩容空间,存在内存冗余;LinkedList每个节点保存前后指针,单个元素内存占用更大;开发选型:绝大多数业务查询多、增删少,优先用ArrayList;频繁头尾增删、无查询场景用LinkedList。2.HashMap的底层原理?JDK1.7和1.8区别?答案:底层核心:HashMap基于「数组+链表+红黑树」实现,通过hash算法定位元素存储位置,解决哈希冲突存储键值对。JDK1.7底层:数组+单向链表,哈希冲突全部挂链表,链表过长时查询效率急剧下降;头插法插入元素,并发场景下容易出现环形链表,导致死循环。JDK1.8优化重点:1)数据结构升级为数组+单向链表+红黑树;2)链表长度超过8且数组容量大于64时,链表转为红黑树,降低查询时间复杂度;3)改为尾插法,避免并发环形链表问题;4)优化hash扰动算法,减少哈希冲突概率。核心参数:默认容量16,负载因子0.75,扩容阈值=容量*负载因子,达到阈值自动扩容为原容量2倍。3.HashMap和ConcurrentHashMap的区别?答案:1)线程安全:HashMap线程不安全,并发put会导致数据覆盖、链表环形等问题;ConcurrentHashMap线程安全,是并发场景首选;2)锁机制:JDK1.7ConcurrentHashMap采用分段锁,细化锁粒度;JDK1.8放弃分段锁,采用CAS+synchronized锁数组节点,锁粒度更细,并发效率更高;3)效率:单线程下HashMap效率更高,无锁开销;多线程读写场景ConcurrentHashMap性能远优于HashTable。开发规范:单线程用HashMap,多线程并发存取值用ConcurrentHashMap,禁止使用HashTable。三、JVM与垃圾回收1.JVM内存区域划分?答案:JVM运行时数据区分为5个区域,其中线程私有3个,线程共享2个:线程私有(随线程创建销毁):1)程序计数器:记录当前线程执行的字节码行号,唯一无内存溢出的区域;2)虚拟机栈:存储局部变量、方法栈帧、操作数栈,方法执行完毕自动释放,栈溢出会抛出StackOverflowError;3)本地方法栈:服务于native本地方法,功能和虚拟机栈类似。线程共享(全局共享):1)堆内存:所有对象、数组的存储区域,是GC垃圾回收的核心区域,会发生OOM;2)方法区:存储类信息、常量、静态变量、运行时常量池等。2.垃圾回收的判定方法?哪些对象可作为GCRoots?答案:垃圾判定方式:1)引用计数法:对象被引用计数+1,失效-1,计数为0可回收,无法解决循环引用问题;2)可达性分析法(JVM默认):从GCRoots出发遍历,不可到达的对象判定为垃圾对象。常用GCRoots:1)虚拟机栈中引用的对象;2)方法区中静态变量、常量引用的对象;3)本地方法栈JNI引用的对象;4)活跃线程持有的对象。3.年轻代、老年代垃圾回收机制?MinorGC和FullGC区别?答案:堆内存分为年轻代(Eden、Survivor)和老年代:1)年轻代:新建对象优先分配在Eden区,Eden满触发MinorGC,存活对象移入Survivor区,反复回收达标后晋升老年代;2)老年代:存储长期存活的对象、大对象,空间不足触发FullGC。区别:-MinorGC:只回收年轻代,频率高、速度快,停顿时间短;-FullGC:回收整个堆(年轻代+老年代+元空间),频率低、速度慢,全局STW(暂停所有业务线程),线上应尽量避免。四、多线程与并发1.线程的生命周期有哪些状态?答案:Java线程共6种状态:1)NEW:新建状态,创建线程对象,未调用start();2)RUNNABLE:就绪+运行状态,等待CPU调度或正在执行;3)BLOCKED:阻塞状态,等待获取锁资源;6)TERMINATED:线程执行完毕,终止状态。2.synchronized和Lock的区别?答案:1)底层实现:synchronized是JVM原生锁,底层依赖对象头、监视器实现;Lock是Java代码层面的锁(接口),基于AQS队列实现;2)锁特性:synchronized隐式锁,自动加锁释放锁,不可中断、无法超时;Lock显式锁,手动加锁解锁,支持可中断、超时锁、公平锁、读写锁;3)性能:JDK1.6后synchronized做了偏向锁、轻量级锁优化,性能大幅提升,低竞争场景和Lock持平;高并发竞争场景Lock性能更优;4)功能:Lock可实现细粒度读写分离(ReentrantReadWriteLock),适合读多写少场景,synchronized不支持。实战选型:简单同步场景用synchronized,高并发、需要超时、读写分离场景用Lock。3.线程池核心参数及工作原理?答案:核心7大参数:1)核心线程数:线程池常驻线程,空闲不回收;2)最大线程数:线程池允许的最大线程数量;3)空闲超时时间:非核心线程空闲超时后被回收;4)时间单位:超时时间单位;5)任务队列:存放等待执行的任务;6)线程工厂:创建线程,可自定义线程名、优先级;7)拒绝策略:任务满负荷时的处理策略。工作流程:1)新任务到达,核心线程数未满,创建核心线程执行任务;2)核心线程已满,任务加入阻塞队列;3)队列已满,未达到最大线程数,创建非核心线程执行任务;4)达到最大线程数,触发拒绝策略。开发规范:禁止使用Executors创建线程池,必须手动自定义ThreadPoolExecutor,避免OOM风险。五、Spring核心1.SpringIOC原理?答案:IOC即控制反转,核心是将对象的创建、管理、依赖注入权限交给Spring容器,替代开发者手动new对象。执行流程:1)启动项目,Spring扫描指定包下的注解类(@Component、@Service等);2)解析配置,读取类信息、依赖关系,生成Bean定义信息;3)容器初始化时,根据Bean定义创建单例Bean对象,存入Bean缓存池;4)自动完成依赖注入,程序使用时直接从容器获取Bean。核心优势:解耦代码、统一对象管理、方便扩展和单元测试。2.SpringAOP原理及应用场景?答案:AOP面向切面编程,核心是不修改原有业务代码的前提下,对方法进行增强,基于动态代理实现。代理规则:-目标类有接口,默认JDK动态代理(基于接口);-无接口,使用CGLIB代理(基于子类继承)。常用场景:日志记录、权限校验、事务控制、接口限流、性能监控、缓存处理。3.Spring事务传播机制和隔离级别?答案:传播机制(常用5种):1)REQUIRED:默认,有事务加入当前事务,无则新建事务;2)SUPPORTS:有事务就加入,无则非事务执行;3)MANDATORY:必须在事务内执行,无事务直接报错;4)REQUIRES_NEW:新建独立事务,暂停当前事务;5)NESTED:嵌套事务,依赖父事务,父事务回滚子事务必回滚,子事务回滚不影响父事务。隔离级别:1)READ_UNCOMMITTED:读未提交,存在脏读、不可重复读、幻读;2)READ_COMMITTED:读已提交(默认),解决脏读,存在不可重复读、幻读;3)REPEATABLE_READ:可重复读,解决脏读、不可重复读,存在幻读(MySQL默认);4)SERIALIZABLE:串行化,解决所有问题,性能最低。六、MySQL数据库1.InnoDB和MyISAM区别?答案:1)事务支持:InnoDB支持事务、ACID,MyISAM不支持;2)锁机制:InnoDB支持行锁、表锁,默认行锁,并发性能高;MyISAM只有表锁,并发读写冲突严重;3)崩溃恢复:InnoDB支持事务日志,崩溃可恢复数据;MyISAM崩溃易数据损坏;4)外键:InnoDB支持外键,MyISAM不支持;5)索引结构:均为B+树,InnoDB主键索引存整行数据,辅助索引存主键值;MyISAM索引和数据分离存储。实战选型:业务表一律用InnoDB,MyISAM基本淘汰。2.索引失效场景有哪些?答案:高频失效场景:1)like以%开头(%xxx),索引失效;2)索引列使用函数、运算、类型转换;3)or前后字段未全部建立索引;4)联合索引不满足最左匹配原则;5)字段隐式类型转换(字符串和数字对比);6)MySQL优化器判定全表扫描比索引更快,主动放弃索引。3.慢SQL优化思路?答案:1)先通过explain分析执行计划,查看是否走索引、扫描行数、是否临时表、文件排序;2)对高频查询字段建立合理索引,遵循最左匹配原则;3)避免select*,只查询需要的字段,减少回表;4)优化limit分页,深分页用子查询、延迟关联优化;5)避免大事务、长查询,拆分复杂SQL;6)合理分库分表,解决单表数据量过大问题。七、Redis缓存1.Redis为什么快?答案:1)纯内存操作,无需磁盘IO,读写速度极高;2)单线程模型,避免多线程锁竞争、线程切换开销;3)IO多路复用,单线程高效处理大量客户端连接;4)数据结构设计精简,底层编码优化,操作效率高;5)协议简单,网络传输开销小。2.缓存穿透、击穿、雪崩解决方案?答案:1)缓存穿透:查询不存在的数据,直接打到数据库解决方案:接口层校验、空值缓存、布隆过滤器拦截无效key。2)缓存击穿:热点key过期,瞬间大量请求打数据库解决方案:热点key永不过期、互斥锁、定时预热刷新缓存。3)缓存雪崩:大量key同时过期/Redis宕机,请求全部打数据库解决方案:过期时间加随机值、Redis集群高可用、多级缓存、服务熔断降级。3.Redis持久化机制?答案:1)RDB:快照持久化,定时将全量数据写入磁盘,文件小、恢复快,但会丢失间隔内增量数据,适合备份;2)AOF:日志持久化,记录每一条写命令,数据完整性高,最多丢失1秒数据,文件体积大,恢复速度慢;生产方案:RDB+AOF混合持久化,兼顾数据安全和恢复效率。八、微服务与服务治理1.微服务服务注册发现原理?答案:以Nacos/Eureka为例:1)服务提供者启动后,主动向注册中心注册自身服务信息、IP端口;2)注册中心保存服务列表,定时检测服务心跳,剔除失效服务;3)服务消费者启动后,拉取服务列表缓存到本地;4)调用服务时,本地负载均衡选择节点,完成远程调用。2.熔断、降级、限流的区别?答案:1)限流:限制接口请求频次,防止流量过大压垮服务,针对流量;2)熔断:下游服务异常率过高,直接断开调用,避免级联故障,保护自身服务,针对故障;3)降级:服务压力大时,关闭非核心接口、返回兜底数据,保证核心业务可用,针对资源。九、服务器高频手写面试题1.手写单例模式(双重检查锁)答案:java

publicclassSingleton{

//

温馨提示

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

评论

0/150

提交评论