一、前言
OPPO 我参与的是南京的线下面试,因为投递的时间比较晚(10.8),所以笔试都没有让我做,直接让我过去了
线下面分为两天,第一天技术面,第二天是业务面和 HR 面
除了技术面之外,业务面和 HR 面对于我来说都是新的东西
闲话少说,咱们打板儿就唱哦
二、一面
1、自我介绍
年龄,学校,专业,技术栈,竞赛,项目,实习
2、怼项目
3、实习负责的模块,具体讲一讲
js 逻辑核查引擎,讲了一下大概的业务
4、算法题:找众数,数据大约 10000 个(其实多少个都无所谓)
方法1:
使用 map ,统计每个数出现的次数,然后返回出现次数最多的那个数
空间 O(n),时间 O(n)
方法2:
排序,然后遍历统计
空间 O(1),时间 O(nlogn) <在使用快排或归并排序的情况下>
我为了求稳,写了一个归并排序
方法3:
使用大根堆,后面的逻辑和方法二类似(这个方法有点炫技,堆排序和构建不熟悉的同学不要写,不然可能会自己打自己脸)
空间 O(1) 时间 O(n),这个照理说是最优解(但还是那句话,堆构建除非自己十分熟悉,否则不要写!!)
5、创建线程的方法
继承 Tread 类,实现 Runnable 接口,实现 Callable 接口
然后重写 run 方法,调用 start() 方法
6、还有什么方法
可以使用线程池
7、介绍一下线程池
四个讲了一下,并对 ThreadPoolExecutor 多费了些口舌讲了一下其中参数的含义
8、线程怎么按照顺序启动
9、介绍一下 java 内存模型
(面试官是把内存模型和内存结构的概念搞混了,后来核实了,其实是要问内存结构)
每个线程私有一个虚拟机栈,程序计数器
还有本地方法栈
还有堆区,方法区
10、GC 算法
复制-清除
标记-清除
分代-清除
然后将 minor GC ,major GC 的过程讲了一下(新生代的 Eden区 s1,s2区,老年代是经过新生代多次 GC 放入,或者