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+树索引

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后端开发春招实习面经的更多相关文章

  1. Java后端开发——美团(牛客)

    Java后端开发--美团(牛客) Java的基本数据类型,各自的字节数 ​ 老生常谈,不多说了. 类型 字节数 byte 1字节 short 2字节 int 4字节 long 8字节 float 4字 ...

  2. 2018春招实习笔试面试总结(PHP)

    博主双非渣本计算机软件大三狗一枚,眼看着春招就要结束了,现将自己所经历的的整个春招做一个个人总结. 首先就是关于投递计划,博主自己整理了一份各大公司的春招信息,包括网申地址,开始时间,结束时间,以及自 ...

  3. Java后端开发工程师是否该转大数据开发?

    撰写我对java后端开发工程师选择方向的想法,写给在java后端选择转方向的人 背景 看到一些java开发工程师,对java后端薪酬太悲观了.认为换去大数据领域就会高工资.觉得java后端没有前途.我 ...

  4. Java后端开发

    Java后端开发 名称 内容 基本框架 Spring.Mybatis Linux服务器   数据库优化   消息服务 rabbitMQ.activeMq rocketMq 缓存服务 memcached ...

  5. Java后端开发书架

    本人摘录于江南白衣文章,文章地址:http://calvin1978.blogcn.com/articles/javabookshelf.html 书架主要针对Java后端开发. 3.0版把一些后来买 ...

  6. Java后端开发奋斗之路

    本人方向:Java后端开发方向,本文中内容持续更新中 Java技术栈:https://www.cnblogs.com/wyb666/p/10222070.html 推荐书籍:<程序员代码面试指南 ...

  7. Java后端开发常用工具

    Java后端开发常用工具推荐: 俗话说,工欲善其事,必先利其器.不过初学时候不大建议过度依赖IDE等过多工具,这会让自己的编程基础功变得很差,比如各种语法的不熟悉,各种关键字比如synchronize ...

  8. Java 后端开发常用的 10 种第三方服务

    请肆无忌惮地点赞吧,微信搜索[沉默王二]关注这个在九朝古都洛阳苟且偷生的程序员.本文 GitHub github.com/itwanger 已收录,里面还有我精心为你准备的一线大厂面试题. 严格意义上 ...

  9. 规范——Java后端开发规范

    Java后端开发规范 一.技术栈规约 二.命名规范 三.Java代码规范(注释规范.异常与日志.代码逻辑规范) 四.Mybatis与SQL规范 五.结果检查(单元测试及代码扫描) 六.安全规范 一.技 ...

随机推荐

  1. js基础学习-数组

    let arr1 = [ {name: 1} ] let arr2 = [ {age: 23} ] let ages = [11, 22, 23] let newArr = arr1.concat(a ...

  2. 水电表/燃气表/压力表/传感器/仪器仪表等,超低功耗段码LCD液晶显示驱动IC-VKL144A/B 超低工作电流,36*4COM显示,替代PCF8551/MCP144/BU9792/9B92/BL55072B等

    煤气罐的使用安全隐患较大,现在大部分城市使用管道输送燃气,燃气表的计费大都是通过远程抄表的方式,或者充值的方式,为了让用户更好地了解自家燃气表的使用情况,需要一款液晶屏来显示燃气表的状态和用气量等信息 ...

  3. js 设置滚动条位置为底部

     if (document.getElementById("")) {             document.getElementById("").scro ...

  4. 反射概述和反射获取字节码Class对象的三种方式

    反射:框架设计的灵魂 框架:半成品软件.可以在框架的基础上进行软件开发,简化变法 反射:将类的各个组成部分封装为其他对象,这就是反射机制 好处: 1.可以在程序运行的过程中操作这些对象. 2.可以解耦 ...

  5. Thread类的常用方法_获取线程名称的方法和Thread类的常用方法_设置线程名称的方法

    构造方法: public Thread();分配一个新的线程对象 public Thread(String name);分配一个指定名字的新的线程对象 public Thread(Runnable t ...

  6. 蔚来杯2022牛客暑期多校训练营5 ABCDFGHK

    比赛链接 A 题解 知识点:图论,dp. 暴力建图,连接所有点的双向通路,除了原点是单向的,并且把路径长度作为权值. 随后,从原点出发(\(f[0] = 0\),其他点负无穷,保证从原点出发),按照权 ...

  7. Java开发学习(二十三)----SpringMVC入门案例、工作流程解析及设置bean加载控制

    一.SpringMVC概述 SpringMVC是隶属于Spring框架的一部分,主要是用来进行Web开发,是对Servlet进行了封装.SpringMVC是处于Web层的框架,所以其主要的作用就是用来 ...

  8. 金秋十月 - Apache DolphinScheduler 收获 2 位新 Committer

    点击上方蓝字关注 Apache DolphinScheduler Apache DolphinScheduler(incubating),简称"DS", 中文名 "海豚调 ...

  9. 图解OSI七层模型

    七层模型,亦称OSI(Open System Interconnection)参考模型,是参考模型是国际标准化组织(ISO)制定的一个用于计算机或通信系统间互联的标准体系.它是一个七层的.抽象的模型体 ...

  10. PerfView专题 (第六篇):如何洞察 C# 中 GC 的变化

    一:背景 在洞察 GC 方面,我觉得市面上没有任何一款工具可以和 PerfView 相提并论,这也是为什么我会在 WinDbg 之外还要学习这么一款工具的原因,这篇我们先简单聊聊 PerfView 到 ...