钱塘江上潮信来 今日方知我是我.|

Appletree24

园龄:2年11个月粉丝:25关注:0

2022-07-18 12:20阅读: 253评论: 0推荐: 0

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

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

一面

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

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

jIycXd.png

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.方法区

jIqiWQ.md.png

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


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

本文作者:Appletree24

本文链接:https://www.cnblogs.com/appletree24/p/16489994.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   Appletree24  阅读(253)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起
  1. 1 愛錠 (Edit ver.) LiSA
愛錠 (Edit ver.) - LiSA
00:00 / 00:00
An audio error has occurred.

話してしまえば 思い出

隠してしまえば 幸せ

時間がすべてを奪ってく

What do you think?do you think?

愛してしまえば 地獄で

離れてしまえば 孤独だ

もう戻れない

ああ、想う 想うほど 絡まる愛錠

この手を繋ぐ鎖のように

ただ目の前の明日を信じられるのならば

それだけでいい

今そっと手を伸ばした

もたれてしまえば 2倍で

壊してしまえば それぞれ

時間このまま過ぎ去って

What do you think?do you think?

願ってしまえば 欲しくて

叶ってしまえば 足りない

知っている

もう戻れはしない

あの日には

今夜すべてを置き去りに

独りで逃げ出したって

きっと私はいつまでも

後悔に縛られたまま

ずっときょうを恨みながら

罪責と悪夢に魘されるのでしょう

解けないわ

鉄と鉄が擦れ合い

指と指の温もりも

今ここに貴方を感じられるカギ

ああ、想う 想うほど 絡まる愛錠

この手を繋ぐ鎖のように

ただ目の前の明日を信じられるのならば

それだけでいいよ 今は

ああ、巡る 巡るほど 絡まる愛錠

切れない絆 確かめながら

どんな見えない明日も貴方が傍にいるのなら

それだけでいい

強く確かな愛情