作者:Yyyilia 链接:https://www.nowcoder.com/discuss/766918?source_id=discuss_experience_nctrack&channel=-1 来源:牛客网
1. 自我介绍
2. 项目相关
3. Java中有个String类,如果我们自己写一个java.lang.String类,会出现问题吗
(参考《深入理解Java虚拟机》第7章 虚拟机类加载机制,主要讲了类加载器的种类和双亲委派模型)
4. Java里的Map有哪几种实现
(HashMap | TreeMap | HashTable | LinkedHashMap | ConcurrentHashMap)
5. TreeMap的使用场景,底层数据结构,红黑树的存取复杂度
6. LinkedHashMap的使用场景
(用LinkedHashMap实现lru,按插入顺序(默认) accessOrder = false | 按访问顺序 accessOrder = true,HashMap+双向链表)
7. Java中有个volatile关键字用过吗,用volatile修饰的变量来记录访问次数,需要其他同步操作吗
(场景:单例模式等,参考《深入理解Java虚拟机》第12章12.3.3“对于volatile型变量的特殊规则”,从Java内存模型JMM的角度讲volatile,说明指令中的lock前缀和将esp寄存器的值+0这个空操作)
8. Java有哪些同步方案,如果不加锁呢,加锁会不会太重了
(参考《深入理解Java虚拟机》第13章第2节,从“阻塞同步方案 | 非阻塞同步方案 | 无同步方案”三部分说明,面试官提到加锁会不会太重的时候,我提了一下synchronized锁升级)
9. CAS的ABA问题是什么,要怎么解决
(参考《深入理解Java虚拟机》P477)
10. 有没有用过工具,怎么查看Java堆的统计信息
(参考《深入理解Java虚拟机》第4章,没用过工具,只说了常用了JVM参数)
11. 我们来问问网络吧,DNS是哪层的协议
12. tcp有个状态是Time_Wait,这个具体是在哪儿,作用是什么
13. get和post的区别,用get和post传输的时候有个编码,那个编码的作用是什么
(一开始没听懂问题,说的是Accept-Encoding,后来面试官说是想问http请求中特殊字符的转义)
14. 有没有面过别的公司 | 哪儿的人
15. 给了个C++的结构体,有char、int等3个属性,问占多少内存,换了个顺序,又问占多少内存
(这个不大会,有会的老哥欢迎评论)
16. 算法题:
1. [算法1]:求最大长度的自然序子数组,输出长度和子数组下标(从1开始),不要求连续,自然序是指“123456...”,即3的后面必须是4,以此类推
如,3344567,输出应为4,[2,3,4,5],即数组的第2/3/5/6个元素“3456”
2. [算法2]:二叉树的层序遍历(面试官:再写个常规的吧)
17. 做完题开始问数据库相关的,聚集索引和非聚集索引
18. 事务隔离级别
19. 怎么实现的可重复读
(主要从锁机制+MVCC的角度讲,详细说明了当前要访问的版本的事务id和ReadView中活跃事务id列表的关系,如果大于最大值怎么样,小于最小值怎么样,介于最大值最小值之间要怎么办)
20. 反问
问的内容比较多,算法题让写了两个,用面试官的话来说一个不大常规,一个常规题目,也可能是因为一面的算法拉胯了所以二面问了俩?算法题一边讲思路一边做的,都还算顺利。面试官很和善,很多问题之间都是有联系的,回答的时候没按八股文来,基本都是说自己的理解+书籍上的内容。面试结果很快就出了(大概当天或者第二天),效率很高,约了节后三面。
1.职位分析
字节跳动旗下番茄小说,2019年上线,到现在3年左右,字节想以此进军文学产业,但效果不尽人意。虽说疫情期间宅家的人多了,番茄又主动免费看小说,但是时代变了,如果要从花钱看小说和免费看小说但要看广告中选一个,那我肯定选择自己写小说!免费生意不好干啊,用户留存难,拉新难,还非常容易违法,简直就是在大海上走钢丝,所以意志力一般的人要多考虑考虑。
2.面试分析
1)面试时间:挺长的,一小时多
2)面试内容:多
3)试题难度:中级+
4)试题拓展:多
5)核心考点:jvm+集合+多线程+锁+网络协议+数据库索引+事务隔离机制+算法
6)总结:看面试者自己的总结,大部分面试问题都可以从《深入理解Java虚拟机》中找到答案,说明他对这本书认真研读过,没有看过的人就不要想直接找答案了,书籍中的内容需要自己通过实践操作相结合,才能有更准备的理解,记忆也够深,虽然书本的内容会过时,但是思考问题的方式和思路是永远值得借鉴的。字节大厂,旗下的业务部门的面试也会遵循大厂套路,理论+算法的面试组合简单易行,问的内容偏向底层,所以在学校学习期间一定要花心思去研究,不要觉得背了面试题就高枕无忧了。算法需要长久的练习和顿悟来提升,这方面至今没有好的提升办法。
3.问题解析——CAS
1)独占锁是一种悲观锁,synchronized就是一种独占锁,会导致其它所有需要锁的线程挂起,等待持有锁的线程释放锁。而另一个更加有效的锁就是乐观锁。所谓乐观锁就是,每次不加锁而是假设没有冲突而去完成某项操作,如果因为冲突失败就重试,直到成功为止。乐观锁用到的机制就是CAS,Compare and Swap。
2)CAS乐观锁机制确实能够提升吞吐,并保证一致性,但在极端情况下可能会出现ABA问题。ABA问题导致的原因,是CAS过程中只简单进行了“值”的校验,再有些情况下,“值”相同不会引入错误的业务逻辑(例如库存),有些情况下,“值”虽然相同,却已经不是原来的数据了。CAS乐观锁,必须保证修改时的“此数据”就是“彼数据”,应该由“值”比对,优化为“版本号”比对
大家有什么关于面试想了解的内容,可以在文末留言~