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. WPF 制作 Windows 屏保

    分享如何使用WPF 制作 Windows 屏保 WPF 制作 Windows 屏保 作者:驚鏵 原文链接:https://github.com/yanjinhuagood/ScreenSaver 框架 ...

  2. python 可变、不可变类型、深拷贝、浅拷贝理解

    简介 python中数据分为可变类型,不可变类型.不同的数据类型影响着不同情况下的深浅拷贝. 下面则将简要介绍一下 可变类型 当某个数据的值发生改变时,它对应的内存地址不发生改变,常见的有列表.字典. ...

  3. docker容器技术基础入门

    目录 docker容器技术基础入门 容器(Container) 传统虚拟化与容器的区别 Linux容器技术 Linux Namespaces CGroups LXC docker基本概念 docker ...

  4. Flask像Jenkins一样构建自动化测试任务

    flask这个框架很轻量,做一些小工具还是可以很快上手的. 1.自动化 某一天你入职了一家高大上的科技公司,开心的做着软件测试的工作,每天点点点,下班就走,晚上陪女朋友玩王者,生活很惬意. 但是美好时 ...

  5. 如何实现 System.out.println("a") 显示 b

    今天看到一篇文章不用反射,能否交换两个字符串的值. 心想字符串常量在常量池里面,是在就算用了反射也交换不了吧.转念一想,不对,字符串常量虽然本身在常量池里面,但是它依然是个对象,那么 private ...

  6. Go 语言图片处理简明教程

    虽然 Go 语言主要用于 Web 后端以及各类中间件和基础设施开发,也难免遇到一些图像处理的需求.Go 语言提供的 image 标准库提供了基本的图片加载.裁剪.绘制等能力,可以帮助我们实现一些绘图需 ...

  7. Web 前端实战:JQ 实现树形控件

    前言 这是一篇个人练习 Web 前端各种常见的控件.组件的实战系列文章.本篇文章将介绍个人通过 JQuery + 无序列表 + CSS 动画完成一个简易的树形控件. 最终实现的效果是: 这样结构比较复 ...

  8. for循环与range的使用

    for循环与range的使用 for循环 for循环的本质 for循环和while循环功能基本一致,while循环可以做到的事情for循环也都可以做到,但是for循环可以给他增加一个定义循环次数和范围 ...

  9. 检查一个数值是否为有限的Number.isFinite()

    如果参数类型不是数值,Number.isFinite()一律返回false. Number.isFinite(15); // true Number.isFinite(0.8); // true Nu ...

  10. Mysql8.0修改lower_case_table_names参数导致重启失败

    GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. GreatSQL是MySQL的国产分支版本,使用上与MySQL一致. 事件起因:在测试一个数据迁移工具时,源端oracle ...