2022美团Java后端开发春招实习面经

2023-06-12,,

2022美团Java后端开发春招实习面经

一面

1.讲一下计算机网络的五层架构,每层分别有什么协议

​ 五层架构:应用层、运输层、网络层、数据链路层、物理层

2.什么是 Http 协议,各种 Http 协议状态码的含义

​ HTTP 是超⽂本传输协议,也就是HyperText Transfer Protocol

​ HTTP协议拆解为超文本、传输、协议。可以理解为HTTP是一个在计算机世界里专门在两点之间传输文字、图片、音频视频等超文本数据的约定和规范,至于为什么是在两点间,而不是最常见的Client和Server,是因为有时也会是服务器与服务器的传输

​ Http协议状态码:老生常谈,1xx,2xx,3xx,4xx,5xx

​ 1xx:提示信息,协议处理的一种中间状态

​ 2xx:服务器成功处理了客户端的请求,报文被受到且被正确处理

​ 3xx:重定向,资源位置有变动,需要客户端重新发送请求

​ 4xx:客户端错误,请求报文有误,服务器无法处理

​ 5xx:服务端有误,在处理请求时内部发生了错误

3.Tcp协议为什么是可靠的,Tcp协议的细节

​ 最近在学OS,学完计网回来补

4.进程与线程的区别

​ 最近在学go,拓展一下吧,加一个协程进来,一起写

进程:并发执行的程序在执行过程中操作系统分配和管理资源的基本单位,竞争计算机系统资源的基本单位
线程:进程的一个执行单元,是处理器任务调度和执行的基本单位
协程:比线程更加轻量级的存在,一个线程可以有多个协程。

进程和线程的区别:

根本区别:进程是操作系统资源分配的基本单位,而线程是处理机任务调度和执行的基本单位
资源开销:进程之间具有独立的代码和数据空间(每个进程可以理解为一个可执行文件,将装载模块扔进内存中。称为程序上下文),进程之间的切换会有巨大的系统开销。而线程则是在隶属于的进程中共享代码和数据空间,独立拥有运行栈和PC(程序计数器),也就使得线程间的切换开销很小
包含关系:如果一个进程中有多个线程,现代计算机会并发执行。线程是进程的一部分
内存分配:同一进程的线程共享本进程的地址空间和资源,而进程之间的地址空间和资源都是相互独立的
影响关系:一个进程崩溃以后,在保护模式下不会对其他进程产生影响,但是一个线程崩溃整个进程都会死掉。所以多进程比多线程健壮
执行过程:每个独立的进程有程序运行的入口,顺序执行序列和程序出口。但是线程不能独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制,二者均可并发

5.Linux查看文件用什么指令,查找 123 出现在一个 txt 中的位置用什么指令

​ 不知道这个面试的标准答案会是啥,就写我自己的答案了。应该有很多种方式

​ 查看文件指令:cat 文件位置

​ 查找123出现在一个txt中的位置:grep 要查找的内容 文件位置,其实也可以vim打开然后/内容,只是感觉grep更强大方便一些

6.常用的数据结构有哪些,数组与链表区别,树和链表的区别,哈希冲突的解决方法

​ 常用数据结构:数组、堆、栈、树、哈希表、链表、队列

比较内容 数组(Array) 链表(Linked List)
逻辑结构 1.数组在内存中需要连续的一片空间;2.在使用数组前,必须事先想好数组的长度,并不能后续动态改变;3.元素元素在增加时,可能产生越界的代码BUG;4.因事先要规定好数组的长度,就容易导致存储空间的浪费,利用率较低;5.数组增删需要移动数组中已有的全部元素,费时费力 1.链表采用动态分配内存的方式,在内存中并不需要连续的一片内存空间;2.支持动态的增删元素;3.自由度大,需要时可以new或者malloc申请一片内存,不需要时就使用free或delete来释放内存
内存结构 数组从栈上分配内存,使用方便,自由度较小 链表从堆上分配内存,自由度大,要注意内存泄漏
访问效率 数组的随机访问性强,查找速度快。时间复杂度为O(1),但头插和头删的效率低,为O(N) 链表的查找效率低,为O(N);但删除和插入元素的效率较高,为O(1).同时链表的内存空间并不连续,不存在随机访问性
越界 数组存在越界的风险 只要还有内存空间可被申请,链表就不越界

树和链表的区别:

树是数据结构的一种逻辑结构形式。一个前驱多个后继
链表是数据结构的一种存储结构形式。用数据域以外的附加存储空间表明逻辑关系
树的存储可以用链表进行实现

哈希冲突的解决方法:

线性探测法(寻找一个新的空闲哈希地址)

线性探测法:每次都加一,直到有可以放入的位置即可 不足是会出现聚集现象
平方探测法:将线性探测法中的加一改为12,(-1)2,22,(-2)2……即可
再哈希法:同时构造多个不同的哈希函数,等发生哈希冲突时就使用第二个、第三个……等其他的哈希函数计算地址,直到不发生冲突为止。虽然不易发生聚集,但是增加了计算时间。
链地址法:将所有哈希地址相同的记录都链接在同一链表中。
建立公共溢出区:将哈希表分为基本表和溢出表,将发生冲突的都存放在溢出表中。

7.HashMap 的底层实现, put 的过程,扩容机制,链表转化红黑树的条件,为什么用红黑树不用二叉搜索树

​ 涉及到Java底层了,过一阵子回来补吧。


8.String、StringBuilder、StringBuffer的区别

比较内容 String StringBuffer StringBuilder
执行速度 最差(数据放在常量池中,默认以常量形式保存,且用final进行修饰。因此线程安全,因为当String创建好后就不可改变,所以执行速度是最差的。) 其次 最快(因为不需要考虑线程安全的问题)
线程安全 线程安全 线程安全 线程不安全(StringBuilder并不保证线程安全,所以不推荐在多线程的情况下令多个线程对同一StringBuilder对象进行操作)
使用场景 少量字符串操作(如果程序中有大量的字符串拼接工作,效率极差。避免使用+操作) 多线程环境下的大量操作(因为考虑线程安全) 单线程环境下的大量工作

9.ReentrantLock 和 Synchronized 的区别,讨论了一下实现原理

​ 典中典问题。但是没学,过阵子回来补吧……


10.JVM 内存模型有哪些,分别说说

​ 1.程序计数器

​ 2.虚拟机栈

​ 3.本地方法栈

​ 4.

​ 5.方法区

11.垃圾回收算法有哪些,JVM 老年代用什么垃圾回收算法

垃圾回收算法:

标记-清除
复制算法
标记-整理

JVM老年代GC:

深入理解JVM - 垃圾回收算法 - 腾讯云开发者社区-腾讯云 (tencent.com)

12.说一下 CMS 和 G1 垃圾回收器

CMS垃圾回收器和G1垃圾回收器区别_shlgyzl的博客-CSDN博客_g1垃圾回收器

过阵子回来补吧


13.MySQL索引的实现原理

功夫不负有心人啊……数据结构选的B树没白学

索引类型:

哈希索引(Memory引擎)
B树索引
B+树索引
全文索引(MyISAM和InnoDB)
聚簇索引和非聚簇索引

实现原理:

哈希索引

只有memory(内存)存储引擎支持哈希索引,哈希索引用索引列的值计算该值的hashCode,然后在hashCode相应的位置存执该值所在行数据的物理位置,因为使用散列算法,因此访问速度非常快,但是一个值只能对应一个hashCode,而且是散列的分布方式,因此哈希索引不支持范围查找和排序的功能。
全文索引
这个没了解过,先空着
B树索引和B+树索引
原理就是B树和B+树。我的B站视频【朱江的数据结构课堂】大一数据结构翻转课堂-B树-1_哔哩哔哩_bilibili

14.手撕快排

15.手撕 LeetCode 62,中等难度的DP问题


二面(部分问题围绕群内大佬的项目。项目为一个前后端分离博客,还是记录下来,也算是一点指引)

1.说一下项目的表结构是如何设计的

2.项目中的 RBAC 模型是怎么做的

3.项目的亮点是什么

4.为什么选用了 SpringSecurity 框架

5.如何判断用户是否已经处于登录状态

​ 这里我并没有写过群内大佬跟的这个项目。我只是提供一个我的思路。因为下面一个问题能看出来是用JWT实现登陆的。流程应该如下

1.用户首次登陆。发送请求至服务器后,服务器检查信息是否正确。信息正确后检查数据库,根据信息结合加密算法生成token返回

2.用户通过loaclStorage把token保存到客户端,服务端不存

3.后续请求将Token放到请求头的Authorization中发送给服务端,服务端使用自己保存的密钥验证即可

6.为什么要采用 jwt 的方式进行登陆

为什么不用session:

用户信息是保存在服务端的,开销过大
必须是单机项目,因为用户信息在服务器,如果是分布式,拿不到正确的session
用户直接就可以看到cookie,容易被CSRF攻击(暂时不懂啊)
包含信息过为单一

token的好处:

可以通过参数或请求头进行发送,数据量小,速度快
token负载中包含很多其他信息,与数据库解耦,横向扩容性好,Token的发放验证可以脱离数据库
jwt跨语言,支持的web形式丰富
不在服务端保存信息,对多服务支持友好

7.cookie 和 session 的区别是什么

比较内容 Session Cookie
存储位置 服务器 客户端
安全性 较cookie安全 不安全,明文存储
服务器性能 保存在服务器,有开销 保存在客户端
数据大小 无限制 单个cookie不得超过4k,网站一般限制最多保存20个cookie

8.项目中如何鉴别用户是否有权限进行操作

​ 这个不懂……盲猜可能是SpringSecurity里的

9.为什么使用 AOP 实现日志管理,CGlib 和 jdk 动态代理的区别是什么

​ 过阵子回来补吧,AOP都忘得差不多了……

10.项目中的 redis 主要用于缓存了哪些热点数据,使用了哪种数据结构缓存

11.如果 redis 中对博文点赞数进行了缓存,应该如何倒排点赞数

​ Redis几乎没有深入……盲猜可能是用Zset?

12.使用 redis 的 String 类型进行存储会带来效率问题吗?如何解决项目中的高并发问题

13.博客项目有没有上线,能够承受的并发量大概有多少

14.做项目的时候遇到的难点

15.synchronized 用在普通方法上和静态方法上有什么区别

16.sleep 和 wait 的区别

17.多线程中一个线程怎么终止另一个线程

18.如何设计一个分布式锁

19.能否提供一个超卖问题的解决方案,超卖问题如何从数据库层面解决

20.MySQL 的默认隔离级别是什么,如何在这个隔离级别下解决幻读

21.MVCC 的主要实现原理,解决了什么问题

22.MySQL 的索引类型,什么是最左匹配原则

23.JVM 内存模型的程序计数器有什么用

24.虚拟机栈是否存在栈溢出的问题,什么情况下会溢出

25.为什么新生代不能用老年代的垃圾回收算法,老年代不能用新生代的垃圾回收算法

26.方法区在 jdk 1.7 之前是否会溢出,在 1.8 之后呢

27.Linux 查看实时日志的指令是什么

​ 查看实时日志指令:tail


​ 二面里的问题基本上就不太会了……除了写了答案的,一部分题目是完全没接触过,一部分题目是十分懵懂,所以没有写答案。过一阵子回来弥补吧。

2022美团Java后端开发春招实习面经的相关教程结束。

《2022美团Java后端开发春招实习面经.doc》

下载本文的Word格式文档,以方便收藏与打印。