版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
58同城Java后端真实面试题及详细答案(完整版)本套面试题整理自58同城历年Java后端校招、社招真实面试场景,贴合业务开发、服务架构、性能优化等岗位核心考察点,涵盖Java基础、集合框架、JVM、多线程并发、Spring全家桶、数据库、Redis、微服务及业务实战问题,答案均为职场标准作答话术,贴合面试官考察侧重点。一、Java基础高频面试题1.==和equals的区别是什么?参考答案:两者核心区别是比较的对象不同:1、==是运算符,既可以比较基本数据类型,也可以比较引用数据类型。基本类型比较的是数值本身,引用类型比较的是对象的内存地址;2、equals是Object类的方法,默认情况下和==效果一致,比较对象内存地址;但像String、Integer这类常用类,都重写了equals方法,重写后只比较对象的内容值,不比较地址。日常开发中,判断字符串、包装类内容是否一致,统一用equals;基本类型数值判断用==。2.String、StringBuilder、StringBuffer的区别?参考答案:1、安全性:String是不可变字符串,底层是final修饰的字符数组,线程安全;StringBuilder和StringBuffer是可变字符串;其中StringBuffer所有方法都加了synchronized锁,线程安全,StringBuilder非线程安全。2、性能:String每次拼接都会生成新对象,频繁拼接性能差;StringBuilder无锁,性能最高;StringBuffer加锁,性能相对较低。3、使用场景:少量字符串拼接用String;单线程频繁拼接用StringBuilder;多线程环境下字符串拼接用StringBuffer。3.final、finally、finalize的区别?参考答案:1、final:是修饰符,用于修饰类、方法、变量。final修饰的类不能被继承,修饰的方法不能被重写,修饰的变量是常量,只能赋值一次。2、finally:是异常处理关键字,和try-catch搭配使用。无论代码是否抛出异常,finally中的代码都会执行,常用于释放资源(关闭流、数据库连接等)。3、finalize:是Object类的废弃方法,JVM垃圾回收前会调用该方法,用于对象资源回收。但该方法执行时机不确定、效率低,日常开发完全不推荐使用,JDK9之后已被废弃。4.接口和抽象类的区别?参考答案:1、定义与修饰:抽象类用abstract修饰,接口用interface修饰;抽象类可以有构造方法,接口没有构造方法。2、成员特性:抽象类可以包含普通变量、常量、抽象方法、普通方法、静态方法;接口中默认只能有常量,JDK8后支持默认方法、静态方法,JDK9后支持私有方法。3、继承规则:类只能单继承抽象类,但可以多实现接口;接口可以多继承多个接口。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的哈希值,确定数组下标,实现元素存储;哈希冲突时,下标位置形成链表,链表长度超过阈值(8)且数组容量大于64时,链表转换为红黑树,提升查询效率。JDK1.7与1.8核心区别:1、结构不同:1.7是纯数组+链表,1.8新增红黑树结构,解决链表过长查询慢的问题。2、哈希冲突解决:1.7链表采用头插法,多线程环境下容易出现环形链表,导致死循环;1.8改为尾插法,规避了环形链表问题。3、扩容机制:1.7扩容时会重新计算所有元素哈希位置;1.8优化扩容逻辑,部分元素可直接在原下标或原下标+旧容量位置存储,无需重算哈希。4、初始容量:默认初始容量16,负载因子0.75,扩容阈值=容量*负载因子,两个版本一致。3.HashMap和ConcurrentHashMap的区别?参考答案:1、线程安全性:HashMap非线程安全,多线程并发增删改会出现数据覆盖、死循环等问题;ConcurrentHashMap是线程安全的并发集合。2、加锁方式:JDK1.7的ConcurrentHashMap采用分段锁(Segment),细化锁粒度;JDK1.8放弃分段锁,采用CAS+synchronized锁,只锁住当前数组下标节点,锁粒度更细、并发性能更高。3、效率:HashMap单线程效率最高;ConcurrentHashMap牺牲少量单线程性能,保证并发安全,是多线程场景下的首选。4、空值支持:HashMap允许key、value为空;ConcurrentHashMap不允许key和value为空,避免空指针歧义。三、JVM核心面试题1.JVM内存区域划分及各区域作用?参考答案:JVM运行时数据区分为5个核心区域,其中线程私有3个,线程共享2个:线程私有(随线程创建销毁):1、程序计数器:记录当前线程执行的字节码行号,用于线程切换后恢复执行,是唯一无内存溢出的区域。2、虚拟机栈:存储方法栈帧,包含局部变量表、操作数栈、方法出口等,方法调用和执行都依赖该区域,栈深过大会抛出StackOverflowError。3、本地方法栈:为JNI本地方法(native方法)服务,存储本地方法的执行栈信息。线程共享(随JVM启动销毁):1、堆内存:JVM最大内存区域,所有对象实例、数组都在堆中分配,是垃圾回收的核心区域,会发生OOM。2、方法区:存储类信息、常量、静态变量、即时编译代码等,JDK1.8后方法区改为元空间,使用本地内存,不再占用堆内存。2.垃圾回收的判断依据?哪些对象不会被回收?参考答案:JVM判断对象可回收核心算法是可达性分析算法:以GCRoots为起始节点遍历内存,没有被遍历到、无有效引用的对象,判定为可回收垃圾对象。可作为GCRoots的对象:1、虚拟机栈中引用的对象;2、本地方法栈引用的对象;3、方法区静态变量、常量引用的对象。不会被回收的对象:1、被GCRoots直接或间接引用的存活对象;2、finalize方法中重新关联引用的对象(极少场景);3、静态变量、常量持有的对象。3.常见的垃圾回收器及适用场景?参考答案:1、Serial收集器:单线程收集器,垃圾回收时暂停所有用户线程,适合客户端、小内存单机程序。2、Parallel收集器:多线程并行回收,注重吞吐量,适合后台批量处理、对响应速度要求不高的服务。3、CMS收集器:并发标记清除收集器,注重低延迟,减少用户线程停顿时间,适合互联网高并发、快响应的业务服务,但存在内存碎片。4、G1收集器:分区式垃圾回收,兼顾吞吐量和低延迟,可自定义最大停顿时间,是JDK9+默认收集器,适合大内存服务器、复杂线上服务。四、多线程与并发面试题1.synchronized和Lock的区别?参考答案:1、底层实现:synchronized是JVM原生关键字,底层依赖操作系统互斥锁;Lock是Java接口(常用ReentrantLock),基于代码层面实现锁机制。2、锁特性:synchronized是隐式锁,自动加锁、自动释放锁;Lock是显式锁,需要手动lock()加锁、unlock()释放锁,灵活性更高。3、功能差异:Lock支持可重入、可中断、超时锁、公平锁/非公平锁切换;synchronized仅支持可重入、非公平锁,功能单一。4、异常处理:synchronized发生异常会自动释放锁,不会死锁;Lock异常时不会自动释放锁,必须在finally中手动解锁,否则会造成死锁。日常简单同步场景用synchronized,需要精细化锁控制、高并发场景用ReentrantLock。2.线程池的核心参数及工作原理?参考答案:核心5大参数:1、核心线程数:线程池常驻的线程数量,即使空闲也不会销毁;2、最大线程数:线程池允许创建的最大线程数量;3、空闲超时时间:非核心线程空闲后的存活时间,超时自动销毁;4、时间单位:超时时间的计量单位;5、阻塞队列:存储等待执行的任务队列。工作原理:1、提交任务后,优先创建核心线程执行任务;2、核心线程已满,任务进入阻塞队列排队;3、队列已满,且线程数小于最大线程数,创建非核心线程执行任务;4、线程数达到最大值、队列已满,触发拒绝策略拒绝任务。3.volatile关键字的作用?能保证线程安全吗?参考答案:volatile核心有两个作用:保证变量可见性、禁止指令重排序。1、可见性:一个线程修改volatile变量后,会立即刷新到主内存,其他线程能实时感知到变量的最新值;2、重排序禁止:编译器和CPU不会对volatile修饰的变量指令进行重排序,避免并发场景下的逻辑错乱。不能保证线程安全:volatile不保证原子性,像i++、i+=1这类复合操作,无法通过volatile保证并发安全,需要配合synchronized或Lock使用。五、Spring框架面试题1.SpringIOC的原理和作用?参考答案:IOC即控制反转,是Spring的核心思想。传统开发中,对象的创建、依赖注入由开发者手动控制;IOC将对象的创建、管理、依赖装配权限交给Spring容器,实现控制权的反转。核心原理:容器启动时扫描配置类或注解,解析Bean定义信息,通过反射机制创建Bean实例,根据依赖关系自动完成属性注入,统一管理Bean的生命周期。核心作用:解耦代码,消除硬编码依赖,统一管理对象,方便后续扩展、测试和维护,为AOP、事务等功能提供基础支撑。2.SpringAOP的原理及应用场景?参考答案:AOP即面向切面编程,核心是动态代理机制,在不修改原有业务代码的前提下,对方法进行增强,实现公共功能的抽取复用。SpringAOP底层:目标类有接口时用JDK动态代理,无接口时用CGLIB字节码代理。常见应用场景:统一日志记录、权限校验、事务控制、接口限流、性能监控、异常统一处理等,将通用非业务逻辑与核心业务逻辑解耦。3.Spring事务的传播机制和隔离级别?参考答案:事务传播机制(7种,核心常用5种):1、REQUIRED:默认级别,有事务就加入,无事务新建事务;2、SUPPORTS:支持事务,有则加入,无则非事务执行;3、MANDATORY:强制事务,无事务直接报错;4、REQUIRES_NEW:新建独立事务,暂停原有事务;5、NESTED:嵌套事务,依赖父事务,可独立回滚子事务。事务隔离级别(4种):1、READ_UNCOMMITTED:读未提交,存在脏读、不可重复读、幻读;2、READ_COMMITTED:读已提交,解决脏读,存在不可重复读、幻读(Oracle默认);3、REPEATABLE_READ:可重复读,解决脏读、不可重复读,存在幻读(MySQL默认);4、SERIALIZABLE:串行化,解决所有并发问题,性能最低。六、MySQL数据库面试题1.InnoDB和MyISAM的区别?参考答案:1、事务支持:InnoDB支持事务、ACID特性;MyISAM不支持事务。2、锁机制:InnoDB支持行级锁、表级锁,并发性能高;MyISAM只有表级锁,并发读写冲突严重。3、崩溃恢复:InnoDB支持事务日志,宕机后可恢复数据;MyISAM无日志,宕机易数据损坏。4、外键支持:InnoDB支持外键约束;MyISAM不支持。5、场景适配:InnoDB是默认引擎,适合增删改频繁、需要事务的业务;MyISAM适合静态、查询居多、无需事务的场景。2.索引失效的常见场景?参考答案:1、索引列使用like以%开头模糊查询,如%xxx;2、索引列参与运算、函数调用、类型转换;3、使用or连接无索引字段,导致整体索引失效;4、违背最左前缀原则,联合索引未使用最左侧字段;5、MySQL优化器判断全表扫描比索引查询更快,自动放弃索引;6、字段数据类型隐式转换,如字符串字段不加引号查询数值。3.慢SQL优化的通用思路?参考答案:1、先定位问题:通过slow_query_log日志、explain分析SQL执行计划,查看是否走索引、是否存在全表扫描、临时表、文件排序;2、索引优化:为高频查询字段建立合适索引,避免冗余索引、无效索引,遵循最左前缀原则;3、SQL语句优化:避免select*,只查询所需字段;减少子查询、嵌套查询;优化limit分页、避免大偏移量分页;4、架构优化:大表分库分表、读写分离;高频热点数据缓存到Redis;5、参数优化:调整数据库连接池、缓冲池参数,适配业务流量。七、Redis面试题1.Redis为什么快?参考答案:1、底层基于内存操作,无需磁盘IO,读写速度远超磁盘数据库;2、采用单线程模型,避免多线程锁竞争、线程切换的开销,执行效率高;3、底层数据结构高度优化,如压缩列表、跳跃表等,读写时间复杂度极低;4、采用IO多路复用技术,单线程可监听大量客户端连接,并发处理能力强;5、协议简单,Redis自定义RESP协议,数据解析开销小。2.Redis过期键删除策略和内存淘汰策略?参考答案:过期键删除策略(三种配合使用):1、定时删除:主动遍历删除过期键,占用CPU资源,极少使用;2、惰性删除:访问键时才判断是否过期,过期则删除,节省CPU,但会堆积过期无效数据;3、定期删除:每隔一段时间随机抽查部分键,删除过期数据,平衡CPU和内存开销,是默认策略。内存淘汰策略(常用4种):1、allkeys-lru:所有键中淘汰最近最少使用的键(业务最常用);2、volatile-lru:仅淘汰带过期时间、最近最少使用的键;3、allkeys-random:随机淘汰任意键;4、volatile-ttl:优先淘汰即将过期的键。3.如何解决Redis缓存穿透、击穿、雪崩?参考答案:1、缓存穿透(查询不存在的数据,直接打穿到数据库)解决:缓存空值、布隆过滤器过滤无效key、接口限流校验。2、缓存击穿(热点key过期,瞬时大量请求访问数据库)解决:热点key永不过期、加互斥锁、分布式锁控制缓存重建。3、缓存雪崩(大量key同时过期/Redis宕机,大量请求涌入数据库)解决:过期时间加随机值避免同时过期、Redis集群高可用、服务熔断降级、多级缓存。八、微服务与业务实战面试题(58同城高频)1.微服务架构的优缺点?参考答案:优点:1、服务拆分独立,单个服务迭代、部署、扩容互不影响,开发效率高;2、技术栈灵活,不同业务服务可适配不同技术方案;3、故障隔离性好,单个服务故障不会导致整体系统瘫痪;4、适配高并发场景,可针对热点服务单独扩容。缺点:1、架构复杂度提升,服务调用、注册发现、配置中心等组件依赖多;2、分布式事务、服务熔断、限流、链路追踪问题突出;3、运维成本高,服务数量多,部署、监控、排查难度高于单体架构。2.分布式事务的解决方案?参考答案:1、本地消息表:基于本地数据库消息表,实现消息可靠投递,最终一致性,适合简单业务;2、RocketMQ/Kafka事务消息:利用消息中间件实现分布式事务解耦,行业主流方案;3、TCC补偿事务:手动实现确认、取消、补偿逻辑,一致性高,开发成本高,适合核心金融业务;4、SeataAT模式:无侵入式分布式事务,自动实现回滚补偿,适配大部分微服务业务场景。3.接口限流、熔断、降级的区别和使用场景?参考答案:1、限流:限制接口单位时间请求次数,防止流量过大压垮服务,应对突发高并发流量;2、熔断:下游服务频繁超时、报错时,主动切断调用,避免级联故障,保护自身服务;3、降级:系统压力过大时,关闭非核心业务接口,优先保障核心业务可用,提升系统容错性。三者配合使用,是微服务高可用的核心保障,58同城流量型业务广泛应用该机制。九、面试手写代码高频题1.手写单例模式(双重校验锁)参考答案:java
publicclassSingleton{
//volatile禁止指令重排序
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年中考化学全真练习题库(附答案)
- 卫生和微生物学基础知识培训试题及答案
- 病媒生物防制培训班测试题及参与答案解析
- 招投标类面试题及答案解析
- 北京师范大学2026年9月《发展心理学》作业考核试题及答案参考10
- 大学法律事务(专)民事诉讼法考试题库及答案
- 城市雨水池水华爆发风险与营养盐阈值研究报告
- 2025年公路造价工程师业务考试真题及参考答案
- 广东汕头市潮阳区等校2026-2027学年九年级上学期第一阶段联考10月阶段检测化学
- 剖宫产出血术后护理查房
- 2025~2026学年七年级上学期第一次月考数学试卷【附解析】
- 【2026新版一年级上册数学】第一单元一课一练【人教版】
- (新版)水利工程质量检测员考试大纲题库《公共基础》完整讲义-精讲课件
- 2026年考研管综199真题(试卷+答案)
- 2026年建党105周年党史知识竞赛题库及答案
- 2026年10月自考动漫艺术概论试题及标准答案
- 颈椎病康复指导
- 中核集团校招面试题及答案(2026版)
- 海康威视iVMS-8700智能建筑综合管理平台 软件技术白皮书
- 首届全国行业职业技能竞赛(电力交易员)大赛考试题(附答案)
- 2024年合肥新站高新技术产业开发区招聘社区工作者40人笔试备考试题及参考答案详解1套
评论
0/150
提交评论