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. 背包问题学习笔记 / Dynamic Programming(updating)

    01背包问题     朴素版:(二维数组) 状态表示: dp[i][j]:从前i个物品中选择(每个物品只能选0或1个)且总体积不超过j的集合的最大价值,则dp[n][m]就是最终答案(n:物品数量,m ...

  2. OpenMP入门

    OpenMP入门 前情提要:并行(parallel):需要多个运算核心同时完成 其中有多处理器和单处理器多核两种实现方式,其中差异如下: 同一芯片上的多核通信速度更快 同一芯片上的多核能耗更低 Ope ...

  3. 第十一天python3 递归函数

    递归Recursion 函数直接或者间接调用自身就是递归: 递归需要有边界条件,递归前进段.递归返回段: 递归一定要有边界条件: 当边界条件不满足的时候,递归前进: 当边界条件满足的时候,递归返回: ...

  4. ZJOI2016 小星星 题解

    我一生之敌是状压 本文发表于 洛谷博客:https://www.luogu.com.cn/blog/LoveMC/solution-p3349 Cnblogs:https://www.cnblogs. ...

  5. Iconfont(矢量图标)+iconmoon(图标svg互转)配合javascript来打造属于自己的个性化社交分享系统

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_143 每一个应用程序,其实都会有分享的需求,比如一键分享一篇文章或者一些活动到微博或者微信亦或者是twitter等社交平台,因为人 ...

  6. Serverless之Knative部署应用实例;

    1.什么是Knative? Knative是Google2018的Google Cloud Next大会上发布的一款基于kubernetes的Serverless框架. knative的目的是在kub ...

  7. spring实体类(POJO)参数的赋值(form表单)原理

    10.实体类(POJO)参数的赋值(form表单)原理 10.1.原理解析 测试用例 准备好两个实体类 public class Person { private String name; priva ...

  8. mysql-shell for GreatSQL 8.0.27编译安装及使用

    目录 0. 前言 1. 修改说明 2. 编译mysql-shell 2.1 环境准备 2.2 开始编译mysql & mysql-shell 2.3 利用patchelf修改mysqlsh二进 ...

  9. LuoguP5024 保卫王国(动态DP,LCT)

    最小权覆盖集 = 全集 - 最大权独立集 强制取点.不取点可以使用把权值改成正无穷或负无穷实现 接下来就是经典的"动态最大权独立集"了 O(nlogn). 这不是我说的,是immo ...

  10. node前后端交互(Express)

    1. Express框架是什么 1.1 Express是一个基于Node平台的web应用开发框架,它提供了一系列的强大特性,帮助你创建各种Web应用.我们可以使用 npm install expres ...