第六篇Java技术分享-真实字节跳动面试经历(金三银四跳槽季)
第六篇Java技术分享-真实字节跳动面试经历(金三银四跳槽季)
Jpunster
前文:
千呼万唤始出来,大家久等了。
这篇文章主要介绍一下作者2月份疫情在家面试公司的面试题。包含某某跳动5轮面试题,作者会给出一定的总结及解答,更多的是给大家提供一个面试思路。其他面过的大厂面试题:某米,某行等等我也会单独摘要出来~
正文:
废话结束,干货开始~
<1>.智力测试题,偏最优解,偏一点基础算法。
举例:1个天平,和8个外表相同的球。其中一个球的质量和另外七个球的质量不同。找出这个球的最优解。
解答:其实很多人一看这题就说这不就是二分法吗?这么简单。先4个秤,再2个秤。再2个秤,不就得出答案了吗?其实大家有可能忽视了一个条件,质量不同,没说质量重或者轻,你就没必要第一次4个秤,直接手动分成两份,每份4个,随便取一份两个与两个秤,找出质量不同的那一组。然后找到重的或者轻的那一组与另外4个的一组秤,如果相等,就是第一组的两个里有小球,然后取1个和其他组秤,如果不相等,则此球为所找小球。
我在这里做了很详细的解答,就是提醒大家,看到这种很简单的题目时,不要掉以轻心,注意审题。这种智力测试题,无关乎你的编程技术,只是面试官想看看你的思维以及你是否能认真做一件事情,毕竟没有人愿意和沟通费劲的人一起共事。
<2>常规面试题:
现在你是否在为找工作做准备呢?我看到很多朋友在找工作的时候,一开始就百度一下,java开发工程师面试题,市面上大多数面试题也不分年限,不分时间,上来就是千篇一律的Map,HashMap…真的不想吐槽了,我很负责任的告诉大家,我面的这么多公司,没有一个公司仔细听我说完Map,HashMap底层实现了,并不是说map不重要,知识点(jdk1.7,1.8后底层实现是不同的,hash碰撞,扩容问题,线程安全问题,ConcurrentHashMap,锁机制,segment)而是这种东西需要大家去看下源码,自己分析一下底层实现,自己分析一遍后,就再也不会忘记它底层是怎么实现的了。这也是鼓励大家多去看源码,毕竟源码也是程序员写的,并没有那么高深。还有就是需要你自己根据自己的年限、能力以及你面试公司的岗位及职级对应的去搜索一些面试知识,而不是抱着一个map看几年的样子。
某某跳动面试题:
1.我很清晰的记得这道面试题,因为给我的印象很深(考数据结构):
从数据库聊起来的,mysql5.5版本后(其他关系型数据库我没用过)是使用了InnerDB作为默认存储引擎,聊一下InnerDB和MyISAM的优缺点以及区别,以及在场景下的使用,我举了两个例子,一个需要事物,另一个不需要事物快速查找索引的场景。聊完存储引擎后聊了聊索引实现,在InnerDB下使用B+或者Hash数作为索引,面试官抛出一个问题,B,B-,B+树的区别,B+树做了哪些优化以及为什么mysql用B+树。聊完这个后说写个简单的二叉树,翻转一下二叉树(这个我不会),写一个链表,将链表反置,翻转一下链表等。面试官看我回答的一般也就没再深究数据结构方面的问题,转而问向了算法。
2.算法部分。
(1)记忆最深的是问了一个大数据处理的算法。在有限的内存中,将一个20TB的字符串型列表排序(引出问题,根据这一条链问到了我不会为止)。我第一反应是最笨的方法,加内存,在机器内存足够大的情况下,用map存key,取value。当然这种解法被否定了,就这么多内存。第二反应是mapreduce中可以将数据切片,存储在不同服务器中,然后取片来读进内存,进行一片片排序。面试官说这种方法可以,那有没有不使用框架的前提下,用算法实现呢?我又想,那我自己切片存储不就可以了吗?我将这个列表,切片,存储在不同的服务器下,分片式读进内存,分片排序。这时候出现了一个问题:那我怎么将这些碎片化数据整合排序呢?在面试官的循循善诱下我给出了正确答案(鉴于文件篇幅有些长,公众号后台回复碎片化排序即可获得答案)。
(2)斐波拉契数列非递归实现
(3)股票的最大利润 leetcode有原题。只考察了easy,medium难度。
(4)写一个插入树节点到一颗排序树的插入方法。
(5)链表倒数第N个节点。
时间有点久,只能凭记忆记下这么多。这里告诉我们,平时做项目用的很少的东西,在面试的时候会考察,也就是面试造航母,建议大家没事多刷刷leetcode,做项目做多了有可能会思维固化,养成一定的逻辑。
3.java部分
JUC部分。锁的问题(建议看一下我的juc,我也是面试后系统学习了一下),synchronized和Lock的区别,synchronized内部实现,偏向锁,轻量锁,自旋锁,为什么要自旋,重量锁。
JMM部分:JMM内存模型,volatile关键字。AtomicInteger实现原理(CAS自旋)。
多线程:thread和runnable的区别,线程池,Java线程池ThreadPoolEcecutor参数,基本参数,使用场景。
设计模式:设计模式(工厂模式、单例模式(几种情况))
jvm:线上问题怎么排查?Full GC频繁怎么办?jvm参数调优,双亲委派模型。
spring:IOC和AOP,分别如何实现(classloader、动态代理,静态代理常用于哪里) ,springboot,springcloud简单问了两句。我反问平时用的最多为什么这里问的这么少,面试官说,这个大家都用,都是常用的,看你简历写的那么多,没必要问。已经过了会springboot,springcloud就可以出门吹牛的时代了。
MySQL(关系型数据库代表),聊了聊索引的匹配原则,以及回表问题,以及设计表、表关系能力。
Nosql(简单聊了聊mongo,redis 问的偏多下篇文章单独拿出来说(埋坑)),列存储数据库,图形数据库(都是简单聊了聊使用,以及使用场景)。
中间件:主要聊了聊ES,MQ的补偿机制。
CAP:CAP理论的理解。
分布式锁,分布式事务:我说的是基于redisson实现的分布式锁。以及使用AT模式的seata实现的分布式事务(这个我是学习过的,聊了很久)。
暂时只能记住这么多了。这还是基于我的文档写的。人的记忆能力真的会衰退的,好记性不如烂笔头呀~
**
证明:原创
**
每次面试完,我都会整理笔记,有需要的后台私信我一下,我有时间可以发给你~
总结一下吧:自己复习了两个多月,也有一定的收获,面试时不要紧张,正常发挥就好,一定要把面试官带到你熟悉的领域。祝大家早日收获到自己想要的offer~
微信扫一扫
关注该公众号