字节跳动-后端开发实习生一二面面经
一面
首先是自我介绍,简单说了一下项目的框架结构。后面问到了 IOC、AOP 的底层原理,没答上来,只知道概念性上的理解...
Java
- 介绍一下 Java 容器,底层源码相关及扩容机制等
答了 HashMap、CurrentHashMap、ArrayList,以及不同 JDK 版本(主要是 JDK 1.7 和 JDK 1.8)实现细节上的差异。问 HashMap 的时候问到 hashCode、equals 方法是怎么重写的,没答上来。
- Java 的锁,线程安全问题
围绕 Synchronized、CAS、volatile 展开。其中提到 volatile 的实现原理提到了在其后面 lock 了一个空操作,从而实现了内存屏障的效果,通过刷新主存中的值来保证了可见性。然后面试官追问内存屏障是什么,主存刷新又是什么原理...答不上来了。
- 问到了动态代理设计模式,没答上来
JVM
- 说说 JVM 关于垃圾回收你了解的东西
从可达性分析、垃圾收集算法、CMS 和 G1 垃圾回收器等方面说。
可达性分析讲了:根节点枚举(通过使用 OopMap 数据结构代替了需要对 GC ROOTS 进行全部扫描的优化,OopMap 处于安全点中,哪些地方又有安全点);三色标记,如何处理新增的引用、切断的引用(增量更新、原始快照)。
垃圾收集算法就是那三种基础算法,提到新生代老年代的时候说到了 Eden 区、Survivor 区,又问了他们的比例。最开始我说 8:1:1 他质疑了一下,我再次确认后他看了看什么后说是这样。
垃圾回收器就是讲大体的四个过程,为什么要在并发标记之后再需要一次停顿用户线程的标记(增量更新、原始快照,具体是什么样的算法)。
- 问了什么时候会引起垃圾回收,哪些情况
新生代、老年代溢出这个就不多说了。后面提到因为 Survivor 区用来存对象的空间只有 10%,如果存活对象超过了可以容纳的对象,要通过分配担保机制直接进入老年代,如果这个时候老年代满了也要垃圾回收(后面想想好像这种情况就包含在了老年代溢出的情况内...)。
MySQL
InnoDB 底层的数据结构,然后说到聚集索引、辅助索引等等
联合索引
问的一个问题,当前有一个索引(a,b,c),如果一个查询语句条件是 b=、c=,能命中这个索引吗。当时我答错了可以命中,还有点坚定因为看书的时候这里印象很深,结果是发现忘记了书上是有一个 order by a...裂开了。(更新一下这里,之前的说法有问题,书上是 a=、b= order by c)
- 事务的隔离级别
继续问怎么实现已提交读和可重复度,提到 MVCC 后问实现原理,答未提交读每次生成快照,已提交读第一次生成快照等等。问 InnoDB 怎么解决幻读问题,在可重复读隔离级别下通过 Next-Key Lock 实现,又问 Next-Key Lock 是怎么实现的,说到 InnoDB 三种类型的行锁。问如果让你来实现对某一行加锁啥的有点忘了,你怎么做,大概说通过记录锁来完成。
算法题
给你一个数字n(n < 1e9),再给你一个数字k(k < n), 要求你找到 1,2,3,... n 按照字典序排序后,第 k 大的数字。
如,n = 15,k = 7;
那 1 ~ 15 按照字典序排序为:1,10,11,12,13,14,15,2,3,4,5,6,7,8,9
最开始说了个暴力法,面试官让我继续优化,后面也一直在引导我。最后用深搜+回溯做的,但最后有一些细节上的问题,加上太紧张了没调出来...这个时候心态已经炸了,感觉要挂了。不过最后还是好的,让我等着马上安排二面。
二面
跟一面重合度很高...说一说不同的地方吧。先是针对项目问了下,问到了底层原理的东西(Spring 为什么这样设计的,Mybatis 存在是为了什么等等,都没答上来,题主只是会熟练用...说到 RESTful 风格时的踩坑,讲了一下关于 Spring MVC 执行过程过滤器、拦截器的问题,以及是通过理解了 Spring 上下文环境、Spring MVC 上下文环境之后得以解决的)。
Java
- 反射技术是什么
好久之前用过这个技术来实现了一个关于代码的复用问题...跟面试官讲了一下之前的用法,他表示显然不是典型用法然后追问到底是用来干嘛()没答出来。
MySQL
- B+ 树为什么只在叶子结点上存数据
非叶子结点能存更多的索引,所以最后 B+ 树的高度可能就更矮。从每个物理页 4KB,一个数据 8 字节分析...但是面试官好像半天没太理解到意思,后面还是再问为什么只在叶子结点上存,索性又讲了下 B 树是在非叶子结点上也存有数据(可能就是想让我对比 B 树和 B+ 树?)。
覆盖索引
对 SQL 进行过调优吗,怎么调的具体说说
从查看应用是查询型应用还是插入型应用开始;慢查询日志定位 SQL;通过 EXPLAIN 观察查询 SQL 是否使用索引等状态。然后又问到,那你是直接加索引吗。我说是的,然后他问那是随便怎么都可以加吗。我说并不是的,索引不能无止境地加。他又问为什么不可以,我大概说因为会很占用磁盘空间...然后似乎也没答对,只好说没有特别去了解为什么不能想加就加,没答上来。
算法题
a+b+c=k 三数之和。
很简单的题。在写题的时候写循环用到了
++i
,然后面试官突然问我为什么是++i
不是i++
...我说这是底层i++
会创建一个临时变量保存值,而++i
不会(在编译器没优化之前是这样)。然后他一直没理解过来,然后问我是不是背题(草)...不过最后还是过了。
最后说说这次一二面的面试感受吧。第一次面试连续面了两门感觉精神上有些顶不住,特别是一面最后算法题感觉炸了没希望了,没想到通知我直接等二面,并且还好第二面算法题出得比较简单稳住了。一二面整体上来看问得真的很细,并且会追问到没东西问或者答不出来为止,并且一面面试官最后算法题一直在引导,就是当时很紧张心里很乱,导致最后细节上没处理好。一二面目前计算机网络、OS 一个还没有问到(八股文白背了呀bushi),希望三面可以多问问。
#字节跳动面经##实习##面经##字节跳动#