前言
写在最前面:目前接了字节的offer
以下面经均是以时间线排列,最好每次面试完都自我总结一下
有些问题比较少的或者没列出来的基本都是在聊项目
春招
腾讯一面(IEG)
- 算法:删除倒数第k节点
- tcp/udp的区别 视频/语音为什么使用udp
- 4次挥手时的timewait
- tcp中的流量控制和拥塞控制
- 进程和线程
- 进程的调度
- 进程的通信方式
- 大端和小端系统
- 队列能否不使用锁进行并发
- 队列要用多少个堆实现
- 静态链接和动态链接
- C++的多态(Java)
- 僵尸进程
字节一面
- 算法:链表反转(m到n)
- mysql索引 最左索引
- visitor模式
- 进程和线程
- 进程通信
- 线程同步
- java锁
- synchronize方法和代码块
- synchronize怎么做到可重入
- CAS 以及哪些领域同样用到cas
- tcp4次挥手 为什么
阿里二面(几乎都是开放性问题)
-
进程切换
-
进程切换分两步:
-
切换页目录以使用新的地址空间
-
切换内核栈和硬件上下文
-
对于linux来说,线程和进程的最大区别就在于地址空间,对于线程切换,第1步是不需要做的,第2是进程和线程切换都要做的。
-
(中断/异常等触发)正向模式切换并压入PSW/PC 。 (Program Status Word 程序状态字。program counter 程序计数器。指向下一条要执行的指令)
-
保存被中断进程的现场信息。
-
处理具体中断、异常。
-
把被中断进程的系统堆栈指针SP值保存到PCB。(Stack Pointer 栈指针。Process Control Block 进程控制块。)
-
调整被中断进程的PCB信息,如进程状态)。
-
把被中断进程的PCB加入相关队列。
-
选择下一个占用CPU运行的进程。
-
修改被选中进程的PCB信息,如进程状态。
-
设置被选中进程的地址空间,恢复存储管理信息。
-
恢复被选中进程的SP值到处理器寄存器SP。
-
恢复被选中进程的现场信息进入处理器。
-
(中断返回指令触发)逆向模式转换并弹出PSW/PC。
-
tcp如何保证可靠
-
tcp如何保证正确性 校验和原理?
-
把伪首部添加到UDP上;
-
计算初始时是需要将检验和字段添零的;
-
把所有位划分为16位(2字节)的字
-
把所有16位的字相加,如果遇到进位,则将高于16字节的进位部分的值加到最低位上,举例,0xBB5E+0xFCED=0x1 B84B,则将1放到最低位,得到结果是0xB84C
-
将所有字相加得到的结果应该为一个16位的数,将该数取反则可以得到检验和checksum。
-
输入http之后的流程
-
java多线程(自己的看法)
-
线程池设置多少合理
-
如何让udp可靠
字节二面(几乎都是为什么)
- http输入之后的过程
- dns的解析过程
- ip传输的过程
- https://blog.csdn.net/thisispan/article/details/7587998
- 整个请求传输的过程
- 什么时候用tcp udp,什么场景下,为什么
- html响应解析渲染的过程
- html head里有什么元素
- 什么时候要多线程,什么时候要多进程
- https://blog.csdn.net/yu876876/article/details/82810178
- https://www.cnblogs.com/yuanchenqi/articles/6755717.html
- 如登陆,如何保证安全性
- 后端如何保证
- 加密算法
- 算法:k个一组地翻转链表
美团一面
- HashMap的实现原理,插入如果冲突,是插入头部还是尾部
- 是否线程安全,哪些是线程安全的
- ConcurrentHashMap如何做到线程安全
- ConcurrentHashMap的size()如何实现
- LinkedHashMap的区别
- 多线程都用什么来开发
- ThreadPoolExcutor的参数,队列使用的是哪种,是否设置初始值,无界队列是否可以
- ThreadPoolExcutor如何操作,原理
- Excutors.newFixed()的缺点
- 其他的线程池方法
- 线程如何做到交替运行
- 多线程如何做到顺序执行
- 线程如何做到等待其他线程完成后执行
- synchronized和lock的区别
- mysql的隔离级别
- mysql的默认隔离级别
- 幻读是什么
- mysql的可重复读是否可以防止幻读
- b树和b+树的区别
- https://blog.csdn.net/z702143700/article/details/49079107
- b+树用作索引的数据结构优势在哪
- 平衡二叉树与红黑树的区别
美团二面
-
网络协议有哪些
-
ThreadLocal的作用,是否线程安全
-
进程间的通信,java进程间的通信
-
Socket 这个方式可以实现,需要在父子进程间进行socket通信
-
队列机制 这种方式也可以实现,需要父/子进程往队列里面写数据,子/父进程进行读取。不太好的地方是需要在父子进程之间加一层队列实现,队列实现有ActiveMQ,FQueue等
-
通过JNI方式,父/子进程通过JNI对共享进程读写
-
基于信号方式,但该方式只能在执行kill -12或者在cmd下执行ctrl+c 才会触发信息发生。
-
TreeMap讲解,里面有什么属性,entry里有什么属性
-
java里有哪些是不需要加锁的同步方法
-
行锁和表锁的区别、场景
-
组合索引的使用,eg. (a, b, c)索引,where a=x; where b=x; where a=x and b=x;哪个能使用索引
-
ArrayList和linkedlist的区别
-
有哪些集合类是线程安全的
-
blockingqueue什么场景下使用
-
java有哪些锁
-
算法:排好序的数组,找2个数的和为M的所有组合
-
算法:大数据下,找出出现频率topK的ip
-
在Hadoop/Spark下如何实现
-
看过哪些书
字节三面
- 最近的项目(我应该说最熟悉的那个。。)
- 写懒加载单例 为什么里外层null判断 为什么加volatile 如何做到复用(泛型)
- 算法:(login, logout),算出在线人数峰值
- 算法:一组边,做成树结构(左点为父,右点为子)
- mysql:每个班级中某科目前10,如何建立索引优化
- 阿里评估
- 问项目,所有涉及的项目
- mysql中索引的区别
- springboot所带来的便利,内嵌容器与直接运行的区别
- 对Collection的了解
- 接口和抽象的区别
腾讯一面()
- 线程池原理,threadlocal
- tcp udp区别,tcp的4次挥手
- 吃鸡用tcp还是udp?
- 客户端发起10次服务调用,udp和tcp场景下,服务端调用的次数?
- 多态的描述
- 抽象和接口
- 浅克隆和深克隆
- 线程和进程的区别
- 进程的同步
- 死锁的条件,如何解决死锁
- 进程句柄在内存中的结构
- http中keep-alive的作用
- 301 302 404 502的意义
- CAS的原理,缺点,如何解决ABA问题
- 静态内部类和非静态内部类
华为一面()
- 算法题:全排列 + 字典序
秋招
- 腾讯一面(音乐源)
- jvm内存 java堆与元空间的区别
- springboot的优点
- springboot的类加载
- jvm的类加载
- jvm的启动过程
- 内存溢出和内存泄漏
- 如何解决内存溢出/泄漏问题
- 最熟悉的数据库
- 悲观锁和乐观锁,分别使用的场景
- 你的优势or你做的最满意的
- rpc调用机制
- 如何实现方法调用
- 服务发现、服务注册
- consul如何做到
- 服务熔断
- hive、hbase的存储
- 列式存储和行式存储,列式存储的实现
- mysql acid
- mysql如何做到事务回滚
- mysql什么时候行级锁、什么时候表级锁
- arraylist和hashmap的底层实现 扩容机制
- 数据库主从同步 如何做 基于redolog/undolog
- mysql 使用for update什么时候行级锁什么时候表级锁
shopee一面
- 算法:数组和target,找出每对乘积为target的数
- 虚拟内存 32位的大小
- tcp和udp 什么场景 流量控制
- mysql 什么是事物 acid 隔离级别
- innodb的默认隔离级别 能阻止什么情况
- acid每个机制分别通过什么来实现(redolog undolog mvcc)
- 索引是什么,优缺点,为什么用b+树,不用hash表、b树、平衡搜索树、红黑树
- hash表是什么,怎么解决冲突,查询和插入的复杂度
- tcp 3次握手
- tcp timewait 大量timewait会如何
- 进程 线程 协程
- 协程的实现机制
网易一面(互娱)
- 算法:已排序数组a,b, a大小为a+b, 将a,b合并到a,仍为排序
- 算法:链表、链表排序(可以二分)
- cache页的调度算法
- java多继承问题,如何实现多继承效果
- java interface是否可以有属性
- gc机制
- java里final的用法(包括类、属性、方法参数、方法内变量
- 进程间通信 有名管道和匿名管道的解释
- linux中的’|‘
- 编译原理(可以回忆回忆,方便讲
- 对Python的了解
- sychronize 死锁的条件
- thread和runnable的区别
- 异常是什么,解释名词。。(是程序本身可以处理的异常。Exception 类有一个重要的子类 RuntimeException。* RuntimeException 类及其子类表示“JVM 常用操作”引发的错误。例如,若试图使用空值对象引用、除数为零或数组越界,则分别* 引发运行时异常(NullPointerException、ArithmeticException)和 ArrayIndexOutOfBoundException。
vc++的函数参数与java的有什么不同
网易二面(互娱)
- 算法:圆内随机点
- 算法:矩阵中最大正方形(LeetCode原题)
- 算法:爬楼
- 腾讯一面(业务运维)
- 算法: 先序遍历、链表有环
- 结构体: 限流器
- linux的指令(重点看看!)
- 服务熔断、限流
字节转正(一面)
- 算法: 爬楼(递归与非递归,递归如何减少复杂度)
- 业务设计: 文件系统,设计数据库表,如何建索引
- oauth
- 服务端如何设置cookies(Nginx)(header里Set-cookie, 参数name,expire…)
- 运营后台请求的全过程(http dns ip …)
- 如何存储登录信息
- b+树的复杂度(logMlogmN = logN)
- b+树的优势
- https的加密方式
- treemap的查询复杂度
字节转正(二面)
- 算法: 堆排序
- 算法: 先序和中序,构造后序
- 算法: 连通图,最小生成树
- https://blog.csdn.net/a2392008643/article/details/81781766
- go channel buffer的作用
- go多态的实现
- 微服务的概念 优劣势(与单体应用比)
- 熔断和降级的原理(熔断的原理和作用要好好看)
- 熔断 - 服务雪崩
- innodb的默认隔离级别
- innodb不串行怎么防止幻读
- innodb的存储结构
- b+树与b树的区别、优势
- b+树非叶子节点不存储数据,可以一次性从磁盘读出更多的索引数据
- b+树在范围搜索中占有很大的优势(b+树链表搜索、b树需要根据中序遍历查找)
- redis分布式锁
- redis zset 读写的复杂度
- 底层skiplist跳表(key:score, value: member), hashmap(key:member, value: score)
- go slice什么时候会扩容,是否会导致与原数组不同
- innodb联合索引的存储结构
- mysql如何查看是否使用了索引(explain)
- mysql explain extra里的using where/using filesort等
- https://segmentfault.com/a/1190000021458117?utm_source=tag-newest
字节转正(三面)
- 算法: 中文字转int
- 算法: 随机数函数f3(0,1,2), 转化成f5(0,1,2,3,4)
- java类加载
- java equals与==的区别,为什么重载equals同时重载hash
vjava string为什么是final
华为一面
- 算法: 乘积为正数的最长子数组
- go与java的区别 感受
- springmvc 请求过来如何识别到哪个方法 最先到达哪个类(具体的调用过程)
- vjava gc
- gc root的选择
- 并发的问题(没太听懂问题。。)
华为二面
- 算法: 探索地图 固定步长 起点走到终点(dfs)
- 其余都是项目问题