vivo Java一面面经,准备二面

vivo提前批面试

#vivo2021届提前批招聘#
华师大渣硕一枚,写下面经积攒人品求 offer。内容不保证对,随便看看就行

一面

vivo 21届提前批,面试时间 2020-06-10 17:50 - 18:13,共23分钟。涉及内容包括项目、开源组件、Java 内存模型、HashMap 底层原理等。全程录音,现在开始记录问题。

1.自我介绍

2.讲一下最近的那个项目

研究生系统,有啥模块

3.简历上开源工具非常多,挑一个掌握的比较好的讲一下。

这边讲了 Spring-boot。
现在很多公司都在用,主要特性就是 IoC 和 AOP。
IoC 就是控制反转,其实就是用 IoC 容器来控制各个单例,比如说 Service、Controller、Bean。(这边忘记说 IoC 容器的实质其实就是一个单例的 Map)
AOP 就是面向切面,Spring 的面向切面就是利用动态代理来实现的,实现方式有使用 CGlib 的动态代理和 JDK 提供的 Proxy 包的动态代理。

4.那我为什么要用 AOP 呢?

因为传统的面向对象在一些场景下不是很灵活,比如说有一个类 A,实现了一个 speak 方法,然后有很多继承的子类。如果我们要在 speak 方法前再添加一个喝水的动作,那么此时我们需要一个个去改子类的代码,这样是非常麻烦的。AOP 就能解决这种困难,只需要实现一个切面就能实现这个功能。

5.有没有其他方式解决你说的这个问题吗?

也有,比如说拦截器,也可以做到。

6.遇到类似的场景我们怎么决定用哪一个方案更好?

(这边有点迷糊了)这就要看具体场景分析了。比如说我们是前端调用一些方法,需要传到后端,如果我们要统一对这些请求先进行处理再实现具体业务的话,就可以使用拦截器,如果说是刚才这种场景的话,就使用 AOP 就行了

7.在项目中有遇到什么技术难点嘛?

研究生系统选课的高并发的问题

8.用异步方案能完全解决这个问题吗?

9.数据库做了主从一致,是数据库之前做过分库分表还是怎么样?

用了 galare 来保证数据库一致

10.为什么会有两个数据库呢?

没有说读写分离这样子,两个数据库主要是为了提高高可用性,一台服务器挂了另一台服务器的数据库还能顶上,单纯的 backup

11.那能讲一下主从一致的方案

用的是 galare 的主从一致

12.数据的同步是实时的?

对,galare 保证了主从数据库的一致性,实时的

13.还用 ELK 做了一个日志系统,怎么做的?

这个就是简单实用 ELK 搭建了一个系统来收集日常 API 实用时日志的收集,我们还做了定制化的轮盘在 Kibana 上,来显示日志情况,比如说某个时间点,某个 API 的请求数比较多导致服务器性能降低,我们就可以针对这个 API 进行优化

14.扯皮问题

15.我看你这边做的都是后台的,这边职位是安卓的,你有什么想法吗?

(必须有想法)说了自己做过的三个安卓项目,一个百度 SDK 的定位和***软件,一个飞机大战游戏,一个弹球游戏,都是小项目

16.做后台和做安卓都能接受是吧?

(必须能)

17.聊一下一些基础知识,看你写了 Git、maven、gradle,看过哪些资料呢?

就是日常使用嘛,(有自己写过脚本嘛?)没有,就是日常使用,比如说项目管理,maven 一下子就搞定了。

18.你们现在编译部署都是自动化了么?

是的,使用 gitlab 托管代码,git 用来版本控制,jenkins 构建,docker 构建好后使用 k8s 进行自动调度

19.整套的脚本控制在哪呢,在 Jenkins 里面?

gitlab 和 Jenkins 都有,都有触发器

20.下面讲一个 Java,Java 内存模型还熟悉吗?

还行,怎么说呢,有线程独占的和线程非独占的,独占的虚拟机栈、本地方法栈和程序计数器,非独占的堆和方法区,现在也叫元空间了。

21.像 GC 这块的话,怎么去识别一个内存对象可以被回收呢?

有两种方法,一种是引用计数法,通过指向该对象引用的数量来判断,如果为 0 就可以被回收。但是这个方法不能解决互相指向的问题,比如说一个对象 A 和一个对象 B,他们相互指向,但是没有引用指向他们,但是垃圾回收期无法回收。
还有一种就是可达性分析,JVM 会使用 GC Roots 列表,从他们触发遍历对象,如果可达就不会被收集,不可达就会被标记放到一个队列中,等待执行 finalize方法

22.那些对象可以作为 roots 节点呢?

(这边记不清了。。。气)局部变量中的对象,static 修饰的,还有 JNI 中的(其实还有,比如说常量、锁对象)

23.刚刚讲了内存对象的回收,类信息(Class 信息)可以被回收嘛?

(这边不太懂)不能,因为 Class 不在堆中,在方法区中,而 GC 用来回收堆中(其实是会的,只是垃圾回收器觉得方法区中的效率不高。只有满足三种情况才会回收类对象:(1)没有该类的对象存在;(2)没有对该类对象Class的引用;(3)加载该类的 classLoader 已被卸载)

24.链表还熟悉吗?

还可以吧,挺熟悉的(可以感觉到)???怎么就感觉到了?

25.怎么判断有环?

(这边没说麻烦的方法,也可以用快慢指针找入口的方法)用 set,遍历的时候看是否遍历到了 set 中的元素

26.像你平时的话,哪些数据结构用的比较多一点?

HashMap 吧,这个用的是最多的

27.可以讲一下嘛?

底层的话其实是用 bucket 数组加链表或者红黑树的存储方法。添加节点的时候先对 key 进行 hash 计算,除了使用 key 的 hashcode 方法之外还需要对 hashcode 的值进行位移操作,然后和 bucket 数组长度进行与计算,得到在 bucket 中的下标,找到这个 bucket 的头结点进行遍历,如果有该值的话就不加而是更新,否则的话就添加。添加操作结束后容量 size ++,如果 size 超过一个阈值,就会将原本的链表结构转化成红黑树,当然如果删除的话低于某个阈值的话,也会从树变成链表。

28.那如果不停地向一个 hashmap 中放元素,会触发它扩容嘛?

会啊,超出一个阈值就会。扩容的时候使用容量和装载因子进行新数组长度的计算,然后创建新数组。然后将原本的数组中的节点全部放到新数组中,当然,这个转移的操作并不是简单的转移,而是每次都要重新计算节点 key 的 hash 值的操作然后添加节点。

29.你这边有什么想要了解的嘛?

(问题就不说了,就是不能问评价!!!白问!)

6月18日更新
成功上岸,感谢牛客!

#vivo2021届提前批招聘##vivo##校招##Java工程师##面经#
全部评论
我觉得aop应该是一种思想,只不过spring采用动态代理的方式来实现,拦截器应该是aop思想的一种特定场景的工具,作用在controller上。而springAOP作用在对Bean的管理上。😂😂😂
1 回复 分享
发布于 2020-06-11 13:07
校友是软院的吗?和你一比才发现我java好多没背过,项目做的也没你深
1 回复 分享
发布于 2020-06-10 22:36
收到秋招offer了吗
点赞 回复 分享
发布于 2020-06-24 22:43
大佬
点赞 回复 分享
发布于 2020-06-13 18:55
楼主收到二面了吗
点赞 回复 分享
发布于 2020-06-11 15:30
看来处女面陪跑了
点赞 回复 分享
发布于 2020-06-11 08:32
今天还没收到  是不是就是陪跑或者分母??
点赞 回复 分享
发布于 2020-06-11 08:10
你竟然扛得住这么多问题
点赞 回复 分享
发布于 2020-06-11 08:07
23分钟问这么多???
点赞 回复 分享
发布于 2020-06-10 23:40
楼主你好,请问你是实习、校招还是社招?岗位是什么?开发的话,是Java方向还是C++方向?或者其他语言方向~
点赞 回复 分享
发布于 2020-06-10 22:31
你的问题和我好像哦,估计是一个面试官,大佬,你收到二面通知了吗?
点赞 回复 分享
发布于 2020-06-10 22:30

相关推荐

求面试求offer啊啊啊啊:1600一个月?
点赞 评论 收藏
分享
面试官人很好,态度和蔼可亲,没答出来时也会引导你去思考。由于是晚上面的,导致我白天一天都有点紧张,面的时候状态也不是很好,正常可能面试官提问完应该思考几秒再答,而我就像抢答一样一口气把所有会的都说出来,这样就导致逻辑比较混乱,东一句西一句的。首先是自我介绍,先把会的技术大致讲一下,由于我八股背的多所以着重讲了一下,Java,go,jvm,MySQL,Redis,计网,操作系统这些,然后一小部分闲聊,然后先问了一下项目,面试官问我这个项目是否落实之类的,直接坦言说是写的练手的,包括之前也写过IM通讯,外卖之类的。然后面试官就把提问的重点放在了八股上。先问了Java:类加载器(答:3种+自定义类加载器、tomcat、原因+双亲委派+好处)JVM参数(答:xmx,xms,newsize这些,问我是如何设定的,我回答是把内存分一半给堆,再把堆分一半给新生代,这方面确实不太了解)然后问了一下并发相关的:线程池(答:线程池的7个参数(忘了线程工厂和阻塞时间了),3个重要参数,还有线程如何启用,为什么要设计最大线程数之类的,提到Java栈默认分配1MB运行时不可以更改)AQS(答:先讲clh是自旋锁+list,然后是AQS在这个基础上做的两个优化,然后举了一下reentrantlock根据state如何获取资源)CAS(答:使用三个字段,aba问题,然后将通常搭配自旋锁实现,面试官问通常会自旋多少次,这个不太了解,答的100,然后问100次大概多少秒,回答微秒级,然后面试官讲了一下怎么做资源可能没用完,意识到可能还需要进行阻塞操作)然后考虑一下Linux命令(top,ps,如何使用管道符过滤线程和使用Linux启动线程没答出来)然后问Redis:持久化机制(答:三种aof,rdb,混合,aof的三个参数刷盘策略,rdb以快照保存,使用bgsave会使用子线程来保存不会阻塞,而aof虽然会阻塞但是只在写完数据后追加一条命令,不会太影响,然后是他俩的优缺点,还有混合是怎么保存数据的)集群模式(答:三种,主从复制到缺点再到哨兵机制,正常使用三个哨兵互相监督,主节点挂了投票选主哨兵然后选主节点,然后额外讲一下脑裂的问题,主节点进行数据更新然后把命令写入aof来同步从节点,最后cluster集群,如何实现,使用16383个哈希槽(艹答成16384了),先根据哈希码取余,再根据节点数取余决定放在哪个节点上,然后问了一下我会怎么选集群模式,首先是cluster的问题,会让管道操作之类的失效,然后哨兵会导致整个集群结构变得复杂,使用小项目可能会考虑哨兵,大的考虑cluster,然后考了一下cluster如果一个节点挂了怎么办,根据节点数重新取余然后数据转移,面试官说这么转移比较慢,有没有别的办法,我隐约记得使用一个类似环形数组的方式,想不起来了)然后考了一下MySQL的b+树(这方面的知识点太多了,导致我什么都想讲逻辑就比较乱,讲了一下聚簇索引,树的叶子节点对应着一张页16KB,MySQL有一个区的概念,把这些页放在同一个区中,这样叶子节点的双向链表遍历时速度更快,然后b+树的扇出比较大(非常二,说成扇度之类的,面试官以为说的是扇区)这样层数就比较小,一行1kb数据的话3层可以放心2000w数据)其他的暂时想不起来了算法是lru,面试官问要不要提示,我说写个,然后写了10分钟左右,说大概写好了,但是面试官指出了2个小错误,第一个马上就改回来了,第二个一直没看出来(大脑这时候已经停止工作了)反问:问学习建议,说根据实际的项目进行深入,考虑应该怎么做,还问了一下组里面是做Java的吗?面试官说他是做go的,组里什么语言都有,语言影响不大,连忙补充了一句我对go的底层有深入源码的学习)结束。总体感觉答得不太好,没有太体现出深度,细节也不够全面。
下一个更好呗:佬,我投完云智一直没消息,多久约的一面啊
查看14道真题和解析
点赞 评论 收藏
分享
评论
5
85
分享

创作者周榜

更多
牛客网
牛客企业服务