2022美团Java后端开发春招实习面经
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:
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后端开发春招实习面经的更多相关文章
- Java后端开发——美团(牛客)
Java后端开发--美团(牛客) Java的基本数据类型,各自的字节数 老生常谈,不多说了. 类型 字节数 byte 1字节 short 2字节 int 4字节 long 8字节 float 4字 ...
- 2018春招实习笔试面试总结(PHP)
博主双非渣本计算机软件大三狗一枚,眼看着春招就要结束了,现将自己所经历的的整个春招做一个个人总结. 首先就是关于投递计划,博主自己整理了一份各大公司的春招信息,包括网申地址,开始时间,结束时间,以及自 ...
- Java后端开发工程师是否该转大数据开发?
撰写我对java后端开发工程师选择方向的想法,写给在java后端选择转方向的人 背景 看到一些java开发工程师,对java后端薪酬太悲观了.认为换去大数据领域就会高工资.觉得java后端没有前途.我 ...
- Java后端开发
Java后端开发 名称 内容 基本框架 Spring.Mybatis Linux服务器 数据库优化 消息服务 rabbitMQ.activeMq rocketMq 缓存服务 memcached ...
- Java后端开发书架
本人摘录于江南白衣文章,文章地址:http://calvin1978.blogcn.com/articles/javabookshelf.html 书架主要针对Java后端开发. 3.0版把一些后来买 ...
- Java后端开发奋斗之路
本人方向:Java后端开发方向,本文中内容持续更新中 Java技术栈:https://www.cnblogs.com/wyb666/p/10222070.html 推荐书籍:<程序员代码面试指南 ...
- Java后端开发常用工具
Java后端开发常用工具推荐: 俗话说,工欲善其事,必先利其器.不过初学时候不大建议过度依赖IDE等过多工具,这会让自己的编程基础功变得很差,比如各种语法的不熟悉,各种关键字比如synchronize ...
- Java 后端开发常用的 10 种第三方服务
请肆无忌惮地点赞吧,微信搜索[沉默王二]关注这个在九朝古都洛阳苟且偷生的程序员.本文 GitHub github.com/itwanger 已收录,里面还有我精心为你准备的一线大厂面试题. 严格意义上 ...
- 规范——Java后端开发规范
Java后端开发规范 一.技术栈规约 二.命名规范 三.Java代码规范(注释规范.异常与日志.代码逻辑规范) 四.Mybatis与SQL规范 五.结果检查(单元测试及代码扫描) 六.安全规范 一.技 ...
随机推荐
- “杀死” App 上的疑难崩溃
在移动应用性能方面,崩溃带来的影响是最为严重的,程序崩了可以打断用户正在进行的操作体验,造成关键业务中断.用户留存率下降.品牌口碑变差.生命周期价值下降等影响.很多公司将崩溃率作为优先级最高的技术指标 ...
- AOV网的实现(数据结构)
#include <stdio.h> #include <stdlib.h> #include <string.h>//我这里的头以及尾巴与书上的不一样. int ...
- 用kubeadm简单部署k8s
一.环境准备 1.三台CentOS6.7虚拟机 master:192.168.0.54 注意:主节点最好是2颗cpu,否则在k8s控制平面初始化的时候会报错: node1:192.168.0.68 n ...
- 哈希-hash
一. 概念 1.引例 有线性表(1,75,324,43,1353,90,46,- ) 目的:查找值为90的元素 常见做法: 1.通过一维数组进行遍历查找 (依次比较)( O(n) ) 2.如果关键字 ...
- 关于静态 RMQ 问题
目录 1. 普通做法 2. Four Russian 算法 3. 随机数据的一种做法 4. 有关转 LCA 的做法 1.1. RMQ 转 LCA 再转 ±1RMQ(RMQ 标准算法) 1.2. 一个优 ...
- 自定义bean对象实现序列化接口
上一个word count的案例中,我们为了理解mapreduce的流程,写了上面的代码.现在我们要把一个实体类序列化.比如现在有这么一个文件,里面的数据格式是这样的: 第一列是时间戳,第二列是手机号 ...
- Apache DolphinScheduler 社区呼唤志愿者
DolphinScheduler是什么? Apache DolphinScheduler 是一个分布式.易扩展并带有强大的可视化界面的大数据工作流调度系统. 2021 年 03 月 18 日正式成为 ...
- vue项目打包后使用reverse-sourcemap反编译到源码(详解版)
首先得说一下,vue项目中productionSourceMap这个属性.该属性对应的值为true|false. 当productionSourceMap: true,时: 1.打包后能看到xxx ...
- package.json 与 package-lock.json 的关系
模块化开发在前端越来越流行,使用 node 和 npm 可以很方便的下载管理项目所需的依赖模块.package.json 用来描述项目及项目所依赖的模块信息. 那 package-lock.json ...
- 【java】学习路线10-权限修饰符详解
/*关于修饰符:类:public default public protected default privatesame class √ ...