北京BAT后端真实面试题及详细答案(无模板化、真实面试向)-1_第1页
北京BAT后端真实面试题及详细答案(无模板化、真实面试向)-1_第2页
北京BAT后端真实面试题及详细答案(无模板化、真实面试向)-1_第3页
北京BAT后端真实面试题及详细答案(无模板化、真实面试向)-1_第4页
北京BAT后端真实面试题及详细答案(无模板化、真实面试向)-1_第5页
已阅读5页,还剩2页未读, 继续免费阅读

下载本文档

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

文档简介

北京BAT后端真实面试题及详细答案(无模板化、真实面试向)说明:题目均为北京百度、阿里、字节现场/线面高频真题,覆盖Java基础、数据库、计算机网络、框架原理、算法、场景实战、项目深挖,答案贴合面试官考察重点,口语化、实战化,无套话,适配校招、社招初/中级后端岗位。一、百度高频面试题(含一二面)1.MyBatis和Hibernate的核心区别,项目中为什么选MyBatis?详细答案:两者都是持久层框架,核心差异在灵活性、自动化程度和适配场景。Hibernate是全自动ORM框架,完全基于对象操作,不用手写SQL,框架自动生成SQL、管理事务和缓存,开发速度快,但SQL不可控,复杂查询、多表关联、批量操作场景下容易出现低效SQL,优化成本极高,且自定义拓展性差。MyBatis是半自动ORM框架,将SQL与代码解耦,SQL由开发者手动编写、自主优化,支持动态SQL、自定义结果映射,适配互联网高频的复杂业务查询、分表分库、批量数据操作。同时轻量、上手简单、容错率低,调试问题更直观。我项目中选择MyBatis,核心是业务场景需要频繁优化SQL、做分页、多条件动态查询,且后期需要对接分库分表,MyBatis的可控性和拓展性更适配,而Hibernate的全自动特性会导致线上SQL性能不可控,不适合互联网高并发业务。日常开发中配合MyBatis-Plus,兼顾了基础CRUD的开发效率和复杂SQL的灵活性。2.数据库索引的底层原理、优缺点,什么场景不适合建索引?详细答案:MySQLInnoDB索引底层采用B+树数据结构,所有数据都存在叶子节点,叶子节点有序且双向链表串联,非叶子节点只存储索引键和指针,不存真实数据,极大减少了索引树的层级,查询效率更高。索引优点:大幅降低数据查询的IO次数,提升select查询效率;唯一索引可以约束字段唯一性,避免脏数据;联合索引可以优化多条件查询,避免全表扫描。索引缺点:占用磁盘存储空间,索引越多,占用空间越大;会降低增删改效率,每次修改数据都需要同步更新索引树,产生额外开销;过多索引会加重数据库维护成本。不适合建索引的场景:1)数据量极小的表,全表扫描效率高于索引查询;2)频繁更新、极少查询的字段,索引维护开销远大于查询收益;3)区分度极低的字段,比如性别、状态,索引失效几乎无查询优化效果;4)频繁写入、批量更新的业务表,过多索引会拖慢写入性能。3.Session和Cache的区别,线上几千个Session如何优化性能?详细答案:核心区别是存储目标、生命周期、作用范围完全不同。Session是服务端为单个用户会话创建的临时存储空间,绑定用户单次登录会话,生命周期从用户登录创建,到会话超时/主动退出销毁,数据默认存储在服务器内存,仅对当前用户生效,主要用于存储用户登录态、临时会话信息。Cache是全局缓存组件,面向整个系统,无用户绑定关系,生命周期可自定义,支持过期淘汰、持久化,作用是缓存热点数据、减少数据库查询压力,对所有访问用户生效。线上大量Session导致性能问题,核心优化方案:1)Session集群化,将Session从单机内存迁移到Redis集中存储,实现Session共享,解决单机内存溢出、集群登录失效问题;2)缩短无效Session超时时间,清理长期闲置的会话;3)精简Session存储内容,只保留用户ID、登录标识等核心字段,不存冗余业务数据;4)采用Token替代传统Session,无服务端存储压力,更适配分布式、高并发场景。4.算法真题:无序数组寻找第K大元素,要求时间复杂度O(n)详细解题思路+答案:常规排序解法时间复杂度是O(nlogn),无法满足要求,最优解法是快速选择算法,基于快排分区思想,平均时间复杂度O(n),最坏O(n²),可通过随机选基准规避最坏情况。核心逻辑:每次选取基准值,将数组分区,左边大于基准、右边小于基准(降序),判断基准位置与K的关系:若基准下标刚好是K-1,直接返回结果;若基准下标小于K-1,只遍历右区间;反之遍历左区间,无需排序整个数组,大幅降低时间消耗。java

//核心代码

publicintfindKthLargest(int[]nums,intk){

returnquickSelect(nums,0,nums.length-1,k);

}

privateintquickSelect(int[]nums,intl,intr,intk){

//随机基准,避免最坏情况

intrandomIndex=l+(int)(Math.random()*(r-l+1));

swap(nums,randomIndex,r);

intpivotPos=partition(nums,l,r);

if(pivotPos==k-1)returnnums[pivotPos];

elseif(pivotPos<k-1)returnquickSelect(nums,pivotPos+1,r,k);

elsereturnquickSelect(nums,l,pivotPos-1,k);

}

//降序分区

privateintpartition(int[]nums,intl,intr){

intpivot=nums[r];

intindex=l;

for(inti=l;i<r;i++){

if(nums[i]>=pivot){

swap(nums,index,i);

index++;

}

}

swap(nums,index,r);

returnindex;

}

privatevoidswap(int[]nums,inti,intj){

inttemp=nums[i];

nums[i]=nums[j];

nums[j]=temp;

}二、阿里高频面试题(一二面核心)1.SpringIOC原理,Bean的生命周期,循环依赖如何解决?详细答案:SpringIOC核心是控制反转,将对象的创建、依赖注入、生命周期管理从业务代码中剥离,交由Spring容器统一管理,实现代码解耦。Bean完整生命周期:1)配置加载,读取XML/注解配置,解析Bean定义;2)实例化,通过反射创建Bean对象;3)属性填充,完成依赖注入;4)初始化,执行前置处理器、init-method、后置处理器;5)销毁,容器关闭时执行destroy-method;6)容器管理,单例Bean常驻容器,多例Bean使用后回收。循环依赖解决方案:Spring默认支持单例Bean的setter循环依赖,无法解决构造器循环依赖。核心依靠三级缓存:一级缓存存完整初始化完成的Bean,二级缓存存已实例化但未赋值的Bean,三级缓存存Bean工厂对象。当A依赖B、B依赖A时,A实例化后先存入三级缓存,再进行属性赋值,创建B时发现需要A,从三级缓存获取A的引用,完成B的初始化,再回补A的属性,最终解决循环依赖问题。2.谈谈CAP理论,实际项目中如何取舍?详细答案:CAP理论是分布式系统核心理论,指一致性、可用性、分区容错性,三者无法同时满足,最多满足其二。一致性:分布式集群中所有节点同一时间数据完全一致;可用性:集群任何时候都能正常响应客户端请求,无宕机、无阻塞;分区容错性:网络分区、节点失联时,系统仍可正常运行。互联网分布式项目中,必须保留P(分区容错性),网络故障、节点宕机是常态,无法规避,因此只能在C和A之间取舍。核心业务场景(支付、订单、交易)优先选择CP,牺牲部分可用性,保证数据绝对一致,宁可短暂不可用,也不出现数据错乱;非核心场景(资讯、首页展示、用户动态)优先选择AP,牺牲强一致性,保证高可用,数据短暂延迟同步不影响用户体验。实际开发中基本都用最终一致性替代强一致性,平衡性能与数据安全。3.线程池核心参数,为什么不推荐使用Executors创建线程池?详细答案:线程池七大核心参数:核心线程数、最大线程数、空闲线程存活时间、时间单位、任务队列、线程工厂、拒绝策略。核心线程数是常驻工作线程数量;任务队列存储等待执行的任务;最大线程数是线程池可容纳的最大线程数量;超出最大线程数+队列容量的任务,触发拒绝策略。不推荐Executors的核心原因是存在线上资源溢出风险,阿里开发手册明确禁止使用:1)newFixedThreadPool、newSingleThreadExecutor:任务队列为无界队列,海量任务堆积会导致内存溢出OOM;2)newCachedThreadPool、newScheduledThreadPool:最大线程数为Integer最大值,高并发下会创建大量线程,导致CPU耗尽、服务宕机;实际项目中必须通过ThreadPoolExecutor手动创建线程池,根据业务并发量、机器配置设置合理参数,自定义拒绝策略,规避线上风险。三、字节跳动高频面试题(现场手撕+场景题)1.手写快排,说明优缺点及优化方案详细答案:快排是分治思想的不稳定排序,核心是选基准、分区、递归排序,平均时间复杂度O(nlogn),最坏O(n²),空间复杂度O(logn)。java

//手写快排标准版

publicvoidquickSort(int[]nums,intleft,intright){

if(left>=right)return;

intmid=partition(nums,left,right);

quickSort(nums,left,mid-1);

quickSort(nums,mid+1,right);

}

privateintpartition(int[]nums,intleft,intright){

intpivot=nums[left];

intl=left,r=right;

while(l<r){

while(l<r&&nums[r]>=pivot)r--;

nums[l]=nums[r];

while(l<r&&nums[l]<=pivot)l++;

nums[r]=nums[l];

}

nums[l]=pivot;

returnl;

}优缺点:优点是平均排序效率极高、常数项小、原地排序空间利用率高;缺点是不稳定排序,有序数组下会出现最坏时间复杂度,递归深度过大可能栈溢出。常用优化方案:1)随机选基准,规避有序数组最坏情况;2)小区间改用插入排序,减少递归开销;3)三路快排,针对重复数据多的数组优化效率;4)非递归实现,避免栈溢出。2.二叉树的最低公共祖先(手撕真题)详细思路+答案:核心递归思路,遍历二叉树,递归查找左右子树的目标节点p、q。终止条件:节点为空、节点等于p或q,直接返回当前节点;递归遍历左、右子树。逻辑判断:左子树返回空,说明目标节点都在右子树,返回右结果;右子树返回空,返回左结果;左右都不为空,说明当前节点就是最低公共祖先。java

publicTreeNodelowestCommonAncestor(TreeNoderoot,TreeNodep,TreeNodeq){

if(root==null||root==p||root==q)returnroot;

TreeNodeleft=lowestCommonAncestor(root.left,p,q);

TreeNoderight=lowestCommonAncestor(root.right,p,q);

//左右都找到,当前是祖先

if(left!=null&&right!=null)returnroot;

//单侧找到,返回单侧结果

returnleft==null?right:left;

}3.高并发场景下,接口超时、重复请求如何处理?详细答案:这是字节业务高频场景题,分两个维度解决:重复请求、接口超时。重复请求解决方案:1)前端做防抖节流,避免短时间多次点击;2)后端接口增加幂等性设计,基于唯一订单号、请求ID做幂等校验,重复请求直接返回上次结果;3)使用Redis分布式锁,同一业务同一时间只允许一次请求,防止重复提交;4)数据库增加唯一索引,从底层杜绝重复数据写入。接口超时解决方案:1)接口分层优化,优化慢SQL、减少冗余查询、增加热点数据缓存;2)设置合理超时时间,区分读写接口超时阈值;3)增加熔断降级,高并发超时堆积时熔断接口,返回兜底数据,避免服务雪崩;4)异步化处理非核心逻辑,通过MQ解耦,同步接口只处理核心流程;5)超时重试机制,针对幂等接口做有限次数重试,非幂等接口禁止重试。四、BAT通用高频面试压轴题1.Redis缓存穿透、击穿、雪崩区别及完整解决方案详细答案缓存穿透:查询不存在的数据,Redis和数据库都查不到,大量空请求打穿到数据库。解决方案:空值缓存、布隆过滤器、接口参数校验、拦截非法请求。缓存击穿:热点Key过期,瞬间大量请求直接访问数据库,压垮数据库。解决方案:热点Key永不过期、互斥锁、后台定时更新热点缓存。缓存雪崩:大量Key同时过期,或Redis集群宕机,所有请求全部落库。解决方案:过期时间加随机偏移、搭建Redis集群高可用、多级缓存、服务熔断降级、限流。2.TCP三次握手、四次挥手,为什么不能两次握手?详细答案:TCP

温馨提示

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

评论

0/150

提交评论