page contents

面经||【字节跳动】-Java岗-头条面经和面试经验分享

从去年七月到现在,我从一个很菜的菜鸡变成了一个有offer的菜鸡。今年春招拿了oppo 、vivo、拼多多、成都头条的offer,现在已经是心满意足了,打算上岸了。首先废话不多说,这里附上我自己的...

attachments-2021-12-Vp8K2ErR61cd1c140e06c.png

从去年七月到现在,我从一个很菜的菜鸡变成了一个有offer的菜鸡。
今年春招拿了oppo 、vivo、拼多多、成都头条的offer,现在已经是心满意足了,打算上岸了。
首先废话不多说,这里附上我自己的简历。(至少头条、拼多多的简历筛选都过了)

img
一般来说,很多公司对了解分布式的人是很感兴趣的,只要你的简历上写了了解分布式,一般都会问到。其实我会的分布式知识也就几个:分布式锁、分布式事务、Dubbo、Zookeeper。这些里面只要了解一些基本都算是加分项。在刚学的时候,觉得分布式只是很难,其实静下心来学,也没有那么难。差不多一个月左右可以基本掌握。
分布式锁:使用数据库怎么实现?使用Redis怎么实现?使用Zookeeper怎么实现。各种实现有什么问题?比如锁泄露、可重入这些问题。这里就不一一讲解了,因为网上一搜分布式锁,讲的都很详细。

分布式事物:二段提交、TCC、本地消息表。这三种会出现各种的优缺点?这里看下博客也就基本都没问题

Dubbo:学习Dubbo主要看官方文档,官方文档写的非常好,里面从Dubbo的基础再到实现细节。个人感觉最好的模块是源码导读模块。
img

这里静下心来看,很容易看懂,把大致思路看懂了,面试基本没什么问题。
Zookeeper:Zookeeper其实了解起来很简单。买本书来看一下,几天就会。
上面这些东西都学得差不多了,分布式知识的基础也就起来了。后面的消息队列什么的我也还没学,就不多说。学会这些的好处上面已经说了,面试官对分布式知识很感兴趣,基本你写就会被问到。


然后是项目,针对项目而言,一般来说简历上写两个项目左右就够了,大多数面试官一般会让你挑一个最好的项目来说。所以多写无意义(当然是针对我这种做的项目不太好的人而言)。所以尽可能的优化你的某一个项目,多使用一些能吹的技术。就比如我的项目写了数据库主从同步,首先为什么要用主从?为什么要读写分离?什么时候读写分离好?Mysql主从原理?线程模型?……这些基本都要掌握。或者说线程池,线程池原理、操作流程、拒绝策略、为什么使用线程池(好处)、线程池种类(Fixed、Single、Cached….),这些不同种类的线程池具体怎么实现的?使用与什么场景?

基本上来说,面试官让你介绍项目的时候,主动权就在你这边,你需要将你项目使用的技术、优化点都说出来,然后引导面试官向某一个方向问问题。比如你提到了用了线程池,很多面试官也就会问你线程池的问题。

然后分享一下自己自我介绍的套路:一般来说,自我介绍先介绍名称、学校、专业,然后是自己做的方向(比如Java后端)。这些完了以后介绍自己学习的东西,比如java,从基本的语法到Jvm,java高并发(给面试官抛出一些可以问的东西),然后是框架、提一下项目…..

上面这些都挺套路的,套路完了,还是要看基本功。对于Java开发来说,JVM是一个必备知识点。JVM内存模型,哪些是线程私有的?虚拟机栈栈帧对应什么?虚拟机栈中局部变量表、操作数栈、动态链接等都有什么作用?这里提一下,动态链接是相对于静态解析而言的,静态解析也就是在类加载阶段有一个解析阶段,是将符号引用转化为直接引用,但是在这个阶段不一定能完全解析方法地址,也就是在不能判断方法执行版本时,比如重载的方法时,就需要靠动态链接来找到对应方法。或者说堆的结构,如何划分?Eden、To Survivor、From Survivor作用各是什么?GC时这些部分有什么功能?比如一个面试官让你介绍GC,首先应该介绍什么样的对象会被GC,这里就要介绍引用计数法和可达性分析法。然后是GC算法,各个算法优缺点,然后是垃圾收集器,一般来说主要了解CMS和G1,当然其它能了解最好也要了解。然后就是JVM调优,jvm参数、调优命令:jstat、jmap、jstack、jps等等。最好自己用一下。后面的至于类加载机制、双亲委派模型都可以通过《深入理解Java虚拟机》这本书了解。

然后是Java高并发,一般来说,很多时候面试官会让写单例模式,我自己写的一般都是volatile 双重检查加锁的形式。主要原因在于这里可以引入介绍volatile和synchronized。volatile保证有序性和可见性。有序性很简单,就是内存屏障,禁止指令重排序。可见性一般来说我会结合缓存一致性协议来说,MESI,具体深入对具体的处理器中的缓存条目进行操作,然后处理器和总线通信等等。这里可以参考《java多线程编程实战指南》,讲的很详细。然后是synchronized关键字的锁的实现,和Lock的区别,做出的优化:适应性自旋锁、偏向锁、轻量级锁,锁什么条件下回升级?这些说完,Lock的实现?AQS?可重入实现?读写锁实现?这些可以参考《java并发编程的艺术》这本书,讲的非常详细、基本从源码的角度来说。总之java并发可以问的问题很多,我个人主要就看了以上我提到的两本书,不会的地方上网查查就行。

再然后是java集合。一般来说集合主要了解ArrayList、LinkedList,它们之间的区别。HashMap、Maps.synchronizedMap、ConcurrentHashMap。针对于HashMap,需要了解1.8优化使用了红黑树和尾插法。然后是需要详细介绍put get resize三个操作,难点在resize,比如当前节点在新的数组会映射到哪一个位置?怎么判断?然后是ConcurrentHashMap使用的分段锁,继承可重入锁实现,1.8使用synchronized关键字 CAS操作实现。上面这些最好都读源码。Set的话一般都是参考Map来实现的,也就是只使用Map的key来存取值。
操作系统,进程线程、进程状态——用户态转内核态,为什么要转?虚拟内存?死锁?进程通信?

计网,TCP和UDP,主要了解三次握手四次挥手,为什么三次,为什么四次?为什么挥手后要等待2MSL才中断?TCP快速重传、滑动窗口、流量控制、拥塞控制、慢启动机制等。一般来说面试官应该对拥塞控制和流量控制更感兴趣。HTTP请求格式,请求行、请求头,请求方法?RESTFUL?请求状态码?HTTPS,对称加密和非对称加密?以非对称加密的方式传递对称加密的秘钥。

然后是Mysql,Mysql要求基本的增删改查语句都要会。然后一般来说Mysql的调优(怎样排查执行慢的sql):慢查询日志、explain分析查看是否走索引,没有索引创建索引,有的话判断索引为什么失效?索引什么时候会失效?最左匹配原则、or条件两边有一边没有使用索引、字段类型隐式转换、like以%开头、表中数据较少导致全表比索引快,这些条件都会导致索引失效。索引的底层实现?介绍B 树?这里主要先介绍BST二叉搜索树,然后从磁盘I/O的角度介绍B树。然后介绍B 树所做的优化,即非叶子节点值存储key,这样这些节点可以存储更多key,也就降低树高度,减少I/O次数;叶子节点以链表形式连接,方便范围搜索。然后是聚簇索引和非聚簇索引。一般来说聚簇索引B 树的叶子节点存储的数据,非聚簇索引叶子节点存储指针,所以非聚簇索引要多一次I/O操作才能读取到数据。最后就是Mysql的主从,主从原理和机制。Mysql我看的书是《深入浅出Mysql》,上面索引讲的不多,还需要自己看博客。

Redis,redis只用一本书就够了,《Redis的设计与实现》。拓展问题有缓存穿透和缓存雪崩?怎么解决?缓存穿透可以使用布隆过滤器、缓存雪崩可以设置随机过期时间。

算法方面,了解数据结构以后就刷leetcode或者《剑指offer》吧。

我会的基本也就这些了。总的来说,我是从去年7月份开始从零开始学的,已经算是很晚了。从开始学习,相继看了《Head First Java》、《Head First 设计模式》、《深入理解Jvm》、《Java EE互联网轻量级框架整合开发— —SSM框架》、《java多线程编程实战指南》、《java并发编程的艺术》、《数据结构与算法》、《Redis设计与实现》、《大型网站技术架构》、《剑指offer》、《ZooKeeper:分布式过程协同技术详解》、《深入浅出Mysql》等等。我认为学习技术不能单了解别人所说的就可以了,最主要是要问为什么。还有就是要沉下心来学习,不断的向前行。

一面:

给你一个已经排序的数组,找到一个元素第一次出现的位置,{1,2,3,3,3,3,4},输出2
我:一直二分,考虑边界
HashMap
TCP介绍
我:可靠数据传输、三次握手、四次挥手、流量控制、拥塞控制…..
使用Zookeeper作为Dubbo注册中心时,Zookeeper结构是什么?(这个Dubbo官网有)
数据库索引及实现
我:介绍B 树
….

二面:

手写单例
你用了volatile,volatile介绍
我:有序性和可见性
Jvm内存模型
Dubbo介绍
我:从服务暴露到服务消费流程,中间提到了SPI机制以及自适应拓展机制
一致性Hash
我:值了解过Dubbo负载均衡里面的一致性hash,介绍了一遍(这里Dubbo源码]导读里也有)
二段提交
我:资源管理器、事物管理器,了解Mysql事物二段提交操作,prepare,commit,rollback
二段提交有什么问题
我:最主要的是单点问题
怎么解决?
我:心跳机制?各个资源管理器建立连接?
不对
我:第三方监控?类似于Redis里的哨兵?
对了

三面:

2T文件,有uid,uname。3T文件,有uid,utext。要求将两个文件uid相同的整合。
我:使用hash,将这些文件进行散列,相同uid会散列到相同文件,然后使用hashmap进行整合
那如果我的hash散列不均匀?全部散列到一个文件?
我:可以排序(面试完发现忘了再散列这种方法)
面试官有点失望,问下一个问题。(手撕)给你一个User,包含id,name,parentId。然后给你一个List,要求将它转换成一棵树的结构。只有一个跟节点,parentId=-1
我:(一开始完全不会)先写找到跟节点,然后找到这个根节点的子节点。找到子节点以后发现将这些子节点进行递归就建立起来了
一张表有ABC三个字段。现在要查BA,BC,B,问怎么建立索引?
我:最左匹配原则,BA,BC
……

以上就是本次分享内容,更多大厂面试经验持续关注六星社区

想要高效学习,指路微信公众号——【python编程学习圈】每日分享学习干货,关注即可免费领取整套Python零基础到入门资料及学习教程,走过路过,千万不要错过!!快行动起来!!

attachments-2022-05-ZwUUz0Co628f2e3079c7b.jpeg

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
小柒
小柒

1474 篇文章

作家榜 »

  1. 轩辕小不懂 2403 文章
  2. 小柒 1474 文章
  3. Pack 1135 文章
  4. Nen 576 文章
  5. 王昭君 209 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章