2018年初面试回顾
抱着面一次学一点知识的心态写下此文,知识浅薄忘扶正。大部分的内容都有链接可以点击
面试岗位分别为:
- 阿里巴巴-优酷-视频分发-高级开发
- 哔哩哔哩-基础架构部
- 饿了么-基础架构部
- 蚂蚁金服-国际事业部
- 阿里云-表格储存
3-5年工作经验岗位。
目录
数据库相关
关系型数据库的特性?
这个问题其实问的是 ACID 这个特性。
数据库的索引是否了解?
大家都听过的,之后会追问,索引如何实现的? B+树的实现 可以参考这篇文章
我觉得一点要注意,可能和我一样忘接了B树是多路的不是二叉树,并且B+树和B树的有个很大的不一样,B+可以通过叶子结点遍历整个一层,而B只能从根节点访问,所以B+在磁盘的上表现更好,因为数据聚合在一起。(阿里的面试官反馈最想知道的其实索引在内存, 比磁盘更快)哪些字段适合增加索引?
这个问题在网上说的也比较的空洞,这里有一个比较好的文章可以看一下 数据索引的选择
这个问题一定注意索引是有成本的,主要在于第一会大量的增加内存空间,之外每一次的插入,更新,删除都需要重新维护索引。设计一个菜市场系统,每天有不同的供应商在系统上提供报价与库存,采购商会选择购买,每天需要打印报表,请设计。
这个问题,不是很难,面试的时候紧张话可能导致思维受阻,我的回答是- 用户表(id, name, phone, type)
- 库存表*(id, user_id, price, stock, category)
- 需求表(id, user_id, quantity, category)
- 交易表(id, buyer_id, seller_id, category, quantity)
设计一个电视剧介绍的数据库,电视剧有名称,描述等信息,考虑分多季,每季有多集?
- 电视剧(id, name, desc….)
- 季数(id, no,teleplay_id, author…)
- 集(id, season_id, url, desc)
开始回答这个问题的时候都考虑到认为是多对多的采用关联表,现在觉得其实一对多,使用外键即可。
之后会催问,如何实现针对VIP可看最新一集,或者是使用观影卷,我的设计增加一个额外的信息表。就不展开多说了。
Redis中的LRU是如何实现的?
看过这个又忘了,我就说了一个暴力的方式,用Array实现,当然Array实现就会CopyArray的开销很慢,面试官当然会问我还有没有更好的方式?那我想了下用Tree自璇吧,面试官懂了,提醒我用 双向链表,好吧,我知道自己错了,这样就很明白LRU的实现了,面试之前还得多看看数据结构相关的。总结:数据库相关的内容大概就是这样的,B站在面试的过程中会考关于数据库设计,这块我觉得我们小公司出身的程序员可能占优吧,因为数据库真的是自己设计的。
Redis中的zset原理
跳跃表的实现方式。联合索引
联合索引的最左匹配原则。
Java相关
Hashmap的实现原理?
这个问题属于烂大街的问题,就不做描述了(Hashmap实现),但是除此之外问了一个问题,在高并发的情况下,hashmap 会导致死循环的问题,这个笔者在工作中没有遇见,这个只是在竞争的情况下才会发生,具体的原因 多线程的情况下的扩容导致 ,没回答上来的难点。Netty为什么可以提高性能?
这个问题Netty实现原理浅析,我觉得核心在Reactor上,采用事件的方式减少了BIO的线程等待,不过面试官好像不太满意,额我还是觉得我应该回答的没错……略尴尬JavaComplier的实现原理?
编译原理没学好,我放弃。这个问题是我说我写过JVM虚拟机因伸出来的,至于我记得部分就是抄袭 《自己动手写Java虚拟机》使用Go做了一个简陋的虚拟机。JVM的GC?
这也是一个老生常谈的问题了,但是一时间还真是记不住,推荐一篇好文 Java 虚拟机面试题全面解析,关于GC的也推荐 GC算法 垃圾收集器,实战推荐 从实际案例聊聊Java应用的GC优化 。还是推荐大家背一背,真心会忘,实在能记得大概吧,不然就有点尴尬。补充一个CMS的细解触发Long GC原因可能是?
没有触发过,发个文How to Reduce Long GC Pauses,简而言之有几个原因- 大量的对象创建
- young和old的比例失调
- 小内存导致使用大量的交换区
- IO堵塞
这里的LongGC应该说的是经常发生GC而不是很长的GC
字节码操作会使用在哪些地方?
笔者所能够想到了就是 Spring在实现动态代理的地方使用了 Cglib,这里有文 字节码操纵技术探秘 实际上我觉得使用的地方应该不是特别多。设计模式的使用
老生常谈 设计模式——开发常用的设计模式梳理解释锁的各种特性
推荐一个文章 java 中的锁 – 偏向锁、轻量级锁、自旋锁、重量级锁
项目相关
- 某项目强依赖Redis,如果Redis挂掉怎么处理?Redis连接变的高延迟怎么处理?
- 设计一个日志收集系统,2K终端会上传日志压缩包200KB以Gzip的方式上传,架构如何设计,最终能够做数据可视化。
算法部分
只有在阿里云的一面的时候考验了写代码的能力。
- 3Sum
这是Leetcode很经典的一道题目了,leetcode-3sum 关键是会引导你去想出最优解。 - 最长递增子串
动态规划的经典问题,longest-increasing-subsequence 写出转移方程还会再问你是否有更优解。
整体看来还是DP问题可能因为代码量少,思维强度大,这个应该是面试中最值得注意的题目了。可以同学学习背包九讲
杂项
你认为好代码的代码应该是怎么样的?
关于这个问题,我觉得代码的一致性,我在这四年来的代码经验中,就像是代码大全开篇所言的(隐喻性),就像是一个房子在构建,如果有标准化的工程,那我们在参观每一个房间的时候就会很省心省力,代码如果都是一致的,那阅读的过程中就会很轻松。**你有什么想问我的? **
这个经久不衰的问题(:-D),我每次都还是喜欢问面试官他工作的难点是什么,和自己的预期进行一个匹配。
其他
大部分的架构部门都会考虑Go,所以都会问下Go学的怎么样,大家如果立志于架构组还需要学习现在更流行的Go语言了。