面经:字节跳动三面已Offer
一面 2021/9/24 约 1h
- 自我介绍
- 项目相关 (团队人数 | 项目应用到的框架等 | 表设计)
- Java 中常用的集合类
(先说 Collection 和 Map 接口,再分别说子接口和实现类,以及大概的区别,没让细讲源码) - 有一组数据,需要按照顺序对它进行加密,如果用集合做的话你会选哪个集合?比如一个数组,其元素本身无序,每个元素是字母或者数字都行,对它从小到大进行你会选哪个集合去存储?
(我当时好像选的 TreeMap?忘记了...) - Java 中线程同步的方案有哪些
(参考《深入理解 Java 虚拟机》第 13 章第 2 节,从 “阻塞同步方案 | 非阻塞同步方案 | 无同步方案” 三部分说明) - Lock 接口的实现类
(参考《Java 并发编程的艺术》第 5 章,Lock 接口的实现基本都是通过聚合了一个同步器的子类来完成线程访问控制的,引出了队列同步器 AQS,实现类讲了 ReentrantLock 和 ReentrantReadWriteLock) - MySQL 查询比较慢的话,通过什么方式来优化
(情况①:偶尔很慢,可能是数据库在查询脏页,或者没拿到锁
情况②:一直很慢,可能是没有索引,或者有索引但没走索引,或者表数据量太大需要分库分表) - http 协议
(http 是哪一层的协议,其传输层协议是什么,三次握手和四次挥手的完整过程) - lc726 原子的数量 (稍微变型,不必统计所有原子的数量,统计输入的目标原子的数量)
- 反问部门和技术栈
其实是面试体验不太好的,不是面试官的面试过程有问题,是他没关消息提示,整个面试过程听了可能上百声 “叮咚” 的消息提示音,一开始没适应的时候会打断思路。最后的算法做的不咋地,给了大概 20min,说了思路没全写完,面试官说思路应该可以,他还有下一场面试。这回算法拉胯了,以为凉了结果过了。
二面 2021/9/29 约 80min
- 自我介绍
- 项目相关
- Java 中有个 String 类,如果我们自己写一个 java.lang.String 类,会出现问题吗 (参考《深入理解 Java 虚拟机》第 7 章 虚拟机类加载机制,主要讲了类加载器的种类和双亲委派模型)
- Java 里的 Map 有哪几种实现 (HashMap | TreeMap | HashTable | LinkedHashMap | ConcurrentHashMap)
- TreeMap 的使用场景,底层数据结构,存取复杂度
- LinkedHashMap 的使用场景 (用 LinkedHashMap 实现 lru,按插入顺序 (默认) accessOrder = false | 按访问顺序 accessOrder = true,HashMap + 双向[链表]
- Java 中有个 volatile 关键字用过吗,用 volatile 修饰的变量来记录访问次数,需要其他同步操作吗 (场景:单例模式等,参考《深入理解 Java 虚拟机》第 12 章 12.3.3“对于 volatile 型变量的特殊规则”,从 Java 内存模型 JMM 的角度讲 volatile,说明指令中的 lock 前缀和将 esp 寄存器的值 + 0 这个空操作)
- Java 有哪些同步方案,如果不加锁呢,加锁会不会太重了 (参考《深入理解 Java 虚拟机》第 13 章第 2 节,从 “阻塞同步方案 | 非阻塞同步方案 | 无同步方案” 三部分说明,面试官提到加锁会不会太重的时候,我提了一下 synchronized 锁升级)
- CAS 的 ABA 问题是什么,要怎么解决 (参考《深入理解 Java 虚拟机》P477)
- 有没有用过工具,怎么查看 Java 堆的统计信息 (参考《深入理解 Java 虚拟机》第 4 章,没用过工具,只说了常用了 JVM 参数)
- 我们来问问网络吧,DNS 是哪层的协议
- tcp 有个状态是 Time_Wait,这个具体是在哪儿,作用是什么
- get 和 post 的区别,用 get 和 post 传输的时候有个编码,那个编码的作用是什么 (一开始没听懂问题,说的是 Accept-Encoding,后来面试官说是想问 http 请求中特殊字符的转义)
- 有没有面过别的公司 | 哪儿的人
- 给了个 C++ 的结构体,有 char、int 等 3 个属性,问占多少内存,换了个顺序,又问占多少内存 (这个不大会,有会的老哥欢迎评论)
- 算法1:求最大长度的自然序子数组,输出长度和子数组下标 (从 1 开始),不要求连续,自然序是指 “123456...”,即 3 的后面必须是 4,以此类推 如,3344567,输出应为 4,[2,3,4,5],即数组的第 2/3/5/6 个元素 “3456”
- 算法二叉树的层序遍历 (面试官:再写个常规的吧)
- 做完题开始问数据库相关的,聚集索引和非聚集索引
- 事务隔离级别
- 怎么实现的可重复读 (主要从锁机制 + MVCC 的角度讲,详细说明了当前要访问的版本的事务 id 和 ReadView 中活跃事务 id 列表的关系,如果大于最大值怎么样,小于最小值怎么样,介于最大值最小值之间要怎么办)
- 反问 问的内容比较多,算法题让写了两个,用面试官的话来说一个不大常规,一个常规题目,也可能是因为一面的算法拉胯了所以二面问了俩算法题,一边讲思路一边做的,都还算顺利。面试官很和善,很多问题之间都是有联系的,回答的时候没按八股文来,基本都是说自己的理解 + 书籍上的内容。面试结果很快就出了 (大概当天或者第二天),效率很高,约了节后三面。
三面
自我介绍
来个算法 输入为两行,第一行:[[3,18], [5, 12], [18, 6]...] 表示 3 到 18 有边,5 到 12 有边... 边是双向的 (就是想说无向图),具有传递性(就是表示[3, 18, 6] 在一个连通分量里)
第二行:[[3, 6], [3, 12]...] 就是问两点是否在同一个连通分量里
输出:[true, false, ...] 思路:并查集,判断两个点是否在同一个连通分量中,核心方法是并查集中的 public boolean isConnected(int x, int y),返回 x 点和 y 点是否在同一个连通分量中再来个算法题
有个词典 ["c", "ch", "chi", "hi"...],给你一个 list,里面的元素是字符串,判断能否通过合理的切分使得字符串能切分成词典中的元素,每个元素可以使用的次数无限,返回是否能切分成功,能则为 true,不能为 false。
比如:["cchic","chihhi"...] 输出 [true, false]
(看完题目,大概说了一下思路,然后尝试让面试官换题。
面试官:为什么要换题呀,你做做试试,我要是换题肯定更难
我:好的 (苦笑)) 思路:动态规划dp[i] 为到字符 ch[i] 为止是否能成功切分,对于 dp[i],如果切分出来的字符串 ch[j...i] 词典中有,并且 dp[j-1] 为 true,则说明能够成功切分,dp[i] 为 true你再看看下一个题吧,一个系统设计题(面试官你真的没有一丁点的八股想问我吗)
设计一个简单的评论系统,要求写出创建表和查询的 sql
①评论包括一级评论和二级评论(即在一级评论下还可以评论)
②一级评论有热度值,热度值为该一级评论下二级评论的条数,二级评论无该属性
③查询方式有两种,一个是按时间排序,一个是按热度值排序,要求分页查询
分页查询的地方说了一下 limit 0, 50 和 limit 100000, 50 的区别和优化方式 这个题答得一般,但是面试官说这个题本身就不容易,只是为了看设计思路本科成绩很好,为什么考研选择了考本校,没选更好的学校,我不是说你的学校不好的意思 答:主要考虑了导师 blabla...
你觉得自己的优势是什么,说说优缺点 (聊的时候提到了为什么没有问常规的基础问题,面试官说因为一二面问了很多,他就没再问)
那问个你简历上写了的吧,你说说 redis的集群
(应该是因为我问了为啥不问八股,就给我来个八股意思一下,果断抓住机会从主从讲到哨兵再讲到 cluster,还讲了如果 master 宕机了,哨兵模式和 cluster 模式分别怎么办,讲了一致性哈希等,该问题主要参考《Redis 设计与实现》)时间差不多了,那我们今天就面到这里(没让反问,一度以为人没了)
牛客:Yyyilia
点个在看你最好看