美团到店-后端开发一面全方位解析:操作系统勿忽视

面试场景:

1. 介绍一下spring的两大核心思想

2. 介绍一下java的代理,以及动态代理和静态代理的区别

3. spring动态代理是如何生成的,jdk动态代理和cglib的区别

4. 介绍一下synchronized关键字、以及synchronized锁和lock的区别

5. 讲一下java中synchronized的锁升级

6. 介绍一下hashMap,如何处理冲突,设计一个哈希函数需要考虑到的要素。

7. 哈希冲突怎么解决,有几种解决方案

8. 介绍一下redis缓存穿刺以及缓存穿透,并说明项目中是如何解决这个问题的

9. 介绍一下布隆过滤器,项目是用布隆过滤器做了什么

10. 操作系统的内核态、用户态分别说一下

11. 进程间的通信方式

12. 进程通信的时候信号量是如何实现的

13. 手撕:添加最少的字符形成回文字串 (abc--> cbabc)

14. 手撕:合并区间

八股文的不多也没有为难,但是第一道手撕hard我是真不行,面试官看我做不出来换成合并区间了,权当增加面试经验了美团到店-后端开发一面

答案简概:

Spring框架的两大核心思想:IoC(Inversion of Control,控制反转):通过容器管理对象的生命周期和依赖关系,将对象的创建、绑定、初始化等过程从代码中抽离至配置文件或注解中,实现了松耦合和可配置化。AOP(Aspect-Oriented Programming,面向切面编程):允许开发者定义“切面”,在这些切面中编写横切关注点如事务管理、日志记录等逻辑,通过代理机制在运行时织入目标方法,增强了业务代码的模块性和重用性。

Java代理及动态代理与静态代理区别:静态代理:代理类在编译时就已经确定,由程序员创建或特定工具生成,代理类与委托类之间存在明显的依赖关系,代理类在程序运行前就已完成。动态代理:在运行时动态生成代理类及其行为,主要分为JDK动态代理和CGLIB代理。 JDK动态代理:基于接口实现,通过InvocationHandler接口和Proxy类创建代理对象,只能代理实现了接口的类。CGLIB代理:通过对类进行字节码增强的方式来实现代理,不需要接口,可以代理任何类,但不是Java标准库的一部分。

Spring动态代理生成机制:Spring使用JDK动态代理或CGLIB代理实现AOP,具体选择哪种方式取决于目标对象是否实现了接口。 若目标对象实现了一个或多个接口,则Spring默认使用JDK动态代理。若目标对象没有实现接口,则Spring会选择CGLIB作为代理机制。

synchronized关键字与Lock区别:synchronized:Java内置的关键字,用于保证线程安全,可以修饰方法或代码块,同一时刻只有一个线程能获取监视器锁并执行同步代码块或方法。Lock(如ReentrantLock):Java并发包提供的显式锁机制,提供了比synchronized更细粒度的控制,例如尝试锁定、定时等待、可中断、公平性设置等功能,使用try-catch-finally语句确保锁能够正确释放。

Java中synchronized锁升级:Java虚拟机为了提高效率,在某些条件下会将synchronized锁从偏向锁、轻量级锁逐渐升级到重量级锁,这是一个优化手段,目的是在竞争较弱的情况下减少不必要的系统开销。

HashMap介绍及冲突处理:HashMap是一种基于哈希表的Map接口的非线程安全实现,采用数组+链表/红黑树存储元素。处理冲突(哈希碰撞)通常采用开放地址法(比如拉链法)或再散列法。在Java的HashMap中,冲突时使用链表(Java 8及以后版本在链表长度达到阈值时会转化为红黑树)链接相同的哈希值的元素。

哈希冲突解决方案:开放寻址法:当发生冲突时,寻找下一个可用位置存放元素。链地址法(如Java HashMap所采用):每个哈希桶是一个链表,所有哈希值相同的数据都存储在这个链表中。再哈希法:使用不同的哈希函数计算新的位置。建立公共溢出区:当主哈希表达到一定负载因子时,将新增元素放入溢出区。

Redis缓存穿透与缓存穿刺:缓存穿透:查询的数据在数据库中不存在,且缓存层不保存空结果,导致每次请求都要去数据库验证,增加了数据库压力。解决方案:可以通过布隆过滤器预判不存在的键,或者对空结果也进行缓存(但要注意过期策略)。缓存穿刺:特指那些未命中缓存且应当被缓存的数据,通常是由于数据刚刚被更新或者初次访问而引起的。解决方案:一般情况下,正常的缓存更新策略即可解决,即当数据库更新时同时更新缓存。

布隆过滤器及其应用:布隆过滤器是一种空间效率极高的概率型数据结构,用于判断一个元素是否在一个集合中,可能存在误报(false positive),但不会漏报(false negative)。在项目中,布隆过滤器常用于预估某个查询请求的结果是否存在,提前拦截可能穿透缓存的请求,减少数据库负担。

操作系统的内核态与用户态:内核态:CPU运行在最高权限级别,可以执行所有的指令,直接操作硬件资源,如内存管理、进程调度、设备驱动等。用户态:限制了程序对硬件的直接访问,大部分应用程序运行在此状态下,以防止错误操作破坏系统稳定性。

进程间通信方式:管道(pipe)、命名管道(FIFO)信号(signal)信号量(semaphore)共享内存(shared memory)消息队列(message queue)互斥量(mutex)临界区(critical section)套接字(socket)

信号量实现进程通信:信号量是一种同步原语,用于控制多个进程对共享资源的访问。进程通过P(wait)和V(signal)操作来申请和释放信号量,从而协调对资源的访问。

手撕代码:大家看看力扣就行啦

原文传送门

专栏合集(超2w+人学习)

#美团##实习##后端##面经#
大厂校招实习最新面经解析 文章被收录于专栏

专注于最新各大厂最新面筋解析

全部评论
信号量实现进程通信 这样答就行么 需要答linux内核的东西么
2 回复
分享
发布于 03-23 21:22 安徽
求面经合集
点赞 回复
分享
发布于 03-23 19:52 北京
联易融
校招火热招聘中
官网直投
有答案的面经就是神!
点赞 回复
分享
发布于 03-24 15:15 江苏

相关推荐

19 194 评论
分享
牛客网
牛客企业服务