我最开始是在1月份寒假的时候投简历 那时候考研成绩还悬而未决 加上网上又在散播焦虑 觉得自己也不能这样闲着 就在学redis\docker 这些想自己搞一个小项目出来 最好是能整出一个小网站来(当然这个目标在暑假的时候才实现 当时还提前买了服务器和域名)
快到2月份时开始在实习僧上投简历 投的都是实习岗 其实这个时候投实习岗已经有些不合适了 因为那时我已经马上要大四下了 自然也吃了比较多的闭门羹 记的刚开始几天实习僧上的回复都是已查看 然后就没了回复 又过了几天出现了几个不合适 可能是因为我简历包装的不错 有几个hr 问了我一下2022应届 还是2023应届 我说是22的 然后就婉拒说抱歉只要23应届的(好像是阿里的一个hr) 这之后就是一直等待 然后一边准备项目学学springboot那套 一边准备复试
然后就在一个下午收到了 天翼阅读的面试电话 当是接到电话的时候我都有些蒙 那边的人说我的简历经过了二轮 才到他的手上 不得不说当时真的是运气好 但也是真的卷 当时真的是有些没反应过来 匆匆忙忙的自我介绍后 面试官就就开始提问了 可能当时真的蛮紧张有几个基础的问题都答的不是很好 我硬憋了几句话后 也只能加上一句 不好意思 我这些没有注意到 对面那边反而在安慰我说没关系 不得不说这个面试管还温和的 这个人也成我后来实习的技术总监 负责带我 整个面试过程大概就20分钟 我感觉有些短 也觉得没了后续
后来几乎是放弃希望了 然后hr加了我的微信 和约了二面的时间 也就是现场面试 当时有些激动 没想到居然能进二面 因为我觉得自己真的没发挥好 二面约在了我返校那天 上午到杭州后到公司旁的一个小旅馆休息了一下(这个旅馆后面实习的时候又)就去面试了 二面真的比一面简单太多了 是主管面 面的也很基础 到一半的时候有人有事找他 然后面试就结束 过了两天收到offer

2022 2 14 天翼文化

第一次面试没有任何准备电话就打过来了 刚开始很紧张 自我介绍也就只有潦草的几句 问了好几个基础的问题都答的不是很好 甚至回答不上来 等慢慢的找到感觉 人冷静下来以后 面试也差不多结束了 不过面试官还是比较柔和基本在鼓励我 说没关系 有点可惜 没想到第一家面的就是一个国企感觉错过了一个很好的机会 18分钟好像的确太快了一些
后续:
进二面了 有些意外 二面是主管 感觉比一面水了很多 问的问题也简单很多 聊10多分钟 下面有人有事情找他 他就下去了 然后就直接结束了过了大概3天左右拿到offer
总的来说比较顺利 整个面试过程面试官都很温和

一面回忆

1.mysql 主要引擎 InnoDB Myisam MERGE

InnoDB是默认存储引擎 InnoDB是事务性存储引擎 也就是说InnoDB支持事务性存储

MyISAM和InnoDB区别

MyISAM虽然性能极佳 而且提供大量特性包括全文索引 压缩 空间函数等 但MyISAM不支持事务和行级锁,

而且最大的缺陷是崩溃后无法安全恢复 MySQL5.5版本后默认的存储引擎为InnoDB

大多数时候我们使用的是InnoDB存储引擎 但是在某些情况下使用MyISAM也是比较合适的 比如读密集的情况

2.mysql使用的索引

MySQL索引使用的数据结构主要有BTree索引和哈希索引

对于哈希索引来说 底层的数据结构就是哈希表 因此在绝大多数需求为单挑记录查询时 可以选择哈希索引 查询性能最快

查询性能最快 其余大部分场景 建议使用BTree索引

MySQL的BTree索引使用的是B树中的B+Tree 但对于主要的两种存储引擎的实现方式是不同的

MYISAM(非聚簇索引): B+Tree叶节点的data域存放的是数据记录的地址。在索引检索的时候 首先按照B+Tree搜索算法搜索索引

如果指定的Key存在 则取出其data域的值 然后以data域的值为地址读取相应的数据记录 这被称为”非聚簇索引”

InnoDB(聚簇索引): 其数据文件本身就是索引文件 相比MyISAM 索引文件和数据是分离的 其表结构数据文件本身就是按B+Tree组织的

一个索引结构 树的叶节点data域保存了完整的数据记录 这个索引的key是数据表的主键是数据库的主键 因此InnoDB表数据文件本身就是

主索引 这被称为聚簇索引 而其余索引都作为辅助索引 辅助索引的data域存储相应的记录主键的值而不是地址

根据主索引搜索时: 直接找到key所在的节点 即可取出数据

根据辅助索引搜索时: 先取出主键的值 再走一遍主索引

因此设计表的时候 不建议使用过长的字段作为主键 也不建议使用非单调的字段作为主键 这样会造成主索引频繁分裂

3.操作系统是如何管理内存的

操作系统内存管理的功能(即操作系统内存管理要做什么):

1.内存的分配与回收

内存分配:

​ 连续分配(会有碎片):

​ 单一连续分配 固定分区分配(内部碎片) 动态分配(外部碎片)

​ 分配算法:首次适应 最佳适应 最坏适应 邻近适应

​ 非连续分配(虚拟内存):

​ 分页管理: 将主存空间划分为大小相等的块

​ 分段管理: 按照程序自身逻辑划分成若干段 每个段有一个段名 每段从0开始编址

​ 段页式

空闲内存管理: 1.位示图 2.链表: (即动态分配 每一项都可以代表一个空闲区 或者是 进程的起始标志 用分配算法进行管理)

2.地址转换:将逻辑地址转换为物理地址

页表: 针对大内存的页表 多级页表 倒排页表

快表(TLB位于MMU中): 就是一种内存缓存 通常位于CPU和CPU缓存之间

3.内存空间的扩充 : 覆盖和交换技术

4.存储保护

4.操作系统虚拟内存

虚拟地址: 程序生成的地址 通过MMU(内存管理单元)把虚拟地址映射为物理内存地址

局部性原理: 空间局部性和时间局部性

基于局部性原理 在程序装入内存的时 只会将程序的一部分装入内存 就可以启动程序 在程序执行过程中如果需要的信息

不在内存中 可以由操作系统将那一部分数据再调入内存 如果操作系统暂时不需要某些内容 可以将其调到外存上 从而腾出

空间供别的作业使用

实现:

请求分页:

​ 页表机制 缺页中断

​ 页面置换算法(OPT最佳置换算法 FIFO先进先出算法 LRU最近最久未使用算法 时钟置换算法)

​ 工作集页面置换算法: 目的减少缺页中断的次数

​ 根据研究表明 大多数程序并不是均匀的访问地址空间 而访问往往是集中于一小部分页面 一次内存访问可能会取出一条指令

​ 也可能会取出数据 或者存储数据 再任一时刻t 都在一个集合 它包含所有最近k次访问所访问过的页面 这个集合就是工作集

请求分段:

5.计算机网络 一台计算机将数据传输到另一台计算机所经历的过程

分两种情况

1.两台计算机在同一个局域网

PC-A————-PORT1-Switch-PORT2————-PC-B

1.PC-A产生的报文如下(报文封装):

步骤1.PC-A通过应用层(应用程序如qq等)产生应用层数据报文,然后报文传给传输层封装源目端口号(tcp/udp),我们把该阶段的报文称为数据段。

步骤2.传输层处理完成后数据报文交给TCP/IP协议中的网络层处理,在网络层处理阶段,网络层主要是给数据段报文添加源目IP地址,在该阶段我们把报文称为数据包

步骤3.数据包传递数据链路层处理,数据链路层的主要作用是协商链路间的协议(链路层常见的协议有以太网,PPP,IPX等);这里我们以日常生活中常见的以太网举例。

在以太网中,数据链路层的主要作用是为数据包封装上源(PC-A的MAC)目(PC-B的MAC)MAC地址。我们把该阶段的报文称为数据帧。

如果PC-Bmac未知,在该阶段PC-A发送ARP广播获取PC-B的MAC地址

步骤4.数据链路层处理完成后,数据报文交给TCP/IP中的物理层(物理层可以理解成PC的物理网卡)来处理,物理层主要作用是通过物理网卡把数据帧通过电信号或光信号传递到网络设备上。

2.交换机工作过程:

步骤1.交换机接收到PC-A发送的首个ARP广播报文,首先学习ARP报文Ethernet头部的源MAC地址,交换机芯片将自动记录PC-A的MAC地址、接收该ARP报文的交换机接口号(PORT1)及此接口所属的VLAN(如VLAN10)等信息,并形成一条MAC表项放入交换机MAC表中,交换机形成PC-A的MAC表项。并且将该报文从除了PORT1外的其它端口转发出去。

步骤2.PC-B接收到PC-A产生的ARP报文后,解封装发现报文是请求自己的MAC地址的。然后回复ARP 回复报文(ARP报文有两种:request,reply报文)。交换机芯片将自动记录PC-B的MAC地址、接收该ARP报文的交换机接口号(PORT2)及此接口所属的VLAN(如VLAN10)等信息,并形成一条MAC表项放入交换机MAC表中,交换机形成PC-B的MAC表项.

步骤3.交换机根据步骤2生成的MAC表项条目,将PC-A产生的目的MAC为PC-B的报文从PORT2口转发至PC-B

**2.不在同一个网段时 **

网络拓扑如下:

network1中的主机A(PCA)发送报文给另一局域网(network2)的主机B,中间经过一台路由器(Router),那么这台路由器就是PC-A的网关

PC-A——network1———-PORT1-Router-PORT2—network2—–PC-B/

1.PC-A产生的报文如下(报文封装):

步骤1.PC-A通过应用层(应用程序如qq等)产生应用层数据报文,然后报文传给传输层封装源目端口号(tcp/udp),我们把该阶段的报文称为数据段。

步骤2.传输层处理完成后数据报文交给TCP/IP协议中的网络层处理,在网络层处理阶段,网络层主要是给数据段报文添加源目IP地址,在该阶段我们把报文称为数据包。

步骤3.数据包传递数据链路层处理,数据链路层的主要作用是协商链路间的协议(链路层常见的协议有以太网,PPP,IPX等);这里我们以日常生活中常见的以太网举例。

在以太网中,数据链路层的主要作用是为数据包封装上源(PC-A的MAC)目(PC-B的MAC)MAC地址。我们把该阶段的报文称为数据帧。

如果PC-Bmac未知,在该阶段PC-A发送ARP广播获取PC-B的MAC地址

步骤4.数据链路层处理完成后,数据报文交给TCP/IP中的物理层(物理层可以理解成PC的物理网卡)来处理,物理层主要作用是通过物理网卡把数据帧通过电信号或光信号传递到网络设备上。

2.路由器接收到该报文后,报文在路由器中的转发过程:

步骤1、路由器收到这个报文,先检查报文中的目的MAC,发现其目的MAC为本机Port1端口的,表明需要本机来进行进一步解析(如果目的MAC不是本机,表明直接进行二层转发,不需要再解析帧的其他内容了);

步骤2、路由器进一步解析报文,得知帧所承载的协议类型为IPv4(协议类型值=0x800),即需要进行IPv4转发;

步骤3、查IP转发表(FIB表),得知该报文并不是发给自己的,而是需要送往出端口Port2,因此,路由器不再继续分析IP头后面的内容。

步骤4、路由器将目的MAC更换成PC-B的MAC,将源MAC更换成出接口Port2的MAC,并将报文从Port2发送出去。

3.PC-B从物理网卡接收到该报文后,PC-B的对报文的处理过程(报文解封装):

步骤1.PC-B的物理网卡(物理层)接收到该报文,PC-B先检查该报文目的MAC地址是否为自己网卡的MAC地址(如果是则接收并进行下一步处理,不是就丢弃该报文);

步骤2.剥离帧头部,PC-B检查数据包中的目的IP地址字段是否为网卡IP地址,如果是择进行下一步处理

步骤3.剥离数据包头部,露出数据段报文头部;PC-B检查帧头部传输层端口号(TCP/UDP端口号),然后进行下一步处理

步骤4.PC-B根据端口号把报文交给相应的应用程序处理(如https=443,http=80)。

6.JVM的内存管理

7.排序算法 (说说你知道的排序算法 并说一下两种算法结合使用的情况)

快速排序 冒泡排序 希尔排序 选择排序 归并排序 堆排序 计数排序 基数排序

8.java并发框架 JUC

9.Linux 搜索字符串命令

grep

10.B+树和平衡二叉树有什么区别

首先要说一下B树
B树是多路平衡查找树 是avl的升级 B树每层会有多个节点 B树的分支结点和叶子节点都存储着数据 每个结点存储M/2到M个关键字,非叶子结点存储指向关键字范围的子结点;所有关键字在整颗树中出现,且只出现一次,非叶子结点可以命中;
然后B+ 又是再B树的基础上为叶子结点增加链表指针,所有关键字都在叶子结点中出现,非叶子结点作为叶子结点的索引;B+树总是到叶子结点才命中;

11.聊聊红黑树

红黑树本质是对 2-3-4树的一种实现

2-3-4树是阶数为4的B树 (O(Log(N))

12.说说你项目中使用redis bitmap实现的签到功能具体是怎么做的