第一篇
一面(3点开始,80分钟)
1.自我介绍,聊了聊学校近况
2.Java 集合框架,看了哪些源码,arraylist、linkedlist原理,让你实现一个 hashmap 机会如何设计(没让手写)
3.线程池的执行过程、核心参数以及常用的几个线程池(感觉每次面试都会问)
4.JVM 的相关知识,OOM 如何定位,说几个虚拟机指令以及虚拟机栈可能会发生什么错误,四种引用类型
5.Java 并发,synchronized 性能为什么提高了(锁升级过程),与 Java 的 lock 有什么区别以及使用场景
6.网络,输入 www.baidu.com 都会发生什么
7.http 报文结构,头部都有哪些字段
8.进程与线程,了解协程吗(大概说了下)
9.死锁了解吗,说一下条件,如何解决
10.让写一下链表实现插入方法(顺序不在这里,忘了在哪了,突然想起来了),查询效率呢,怎么优化
11.写个算法,给一个表达式的字符串(+-*/),算出字符串的结果,没考虑括号说了下括号的思路
二面(45分钟)
1.面试官看着就很厉害,在家办公感觉很忙,上来先问实习的时间以及时长,说最好半年
2.没有自我介绍直接开始,先是网络,TCP 三次握手四次挥手,time_wait 和 close_wait 具体干什么,为什么要三次两次不行吗,有大量连接处于 time_wait 的原因,TCP 是长连接还是短连接
3.Https 了解吗,说一下整个过程(对称加密,非对称加密),与 http 的不同点
4.进程线程又问了,进程间通信方式(剩下的想不起来)
5.数据库部分知识,手写一个 SQL (子查询 感觉主要看 group by 和 having)
6.算法题,最长公共连续子串
第二篇
一面
简历写了分布式,聊聊分布式基本信息(CAP,BASE);
Redis的基础数据类型和具体应用场景;
Redis的set求交集的时间复杂度;
MySQL的索引(B+和B树的区别,为啥用B+);
让你设计数据库会注意什么;
线程和进程的区别和联系;
HTTP的一整套;
还有maven的记不清了,因为直接说了不会...
编程题:力扣32最长有效括号
二面
说说自己项目的请求过来,服务器内部怎么处理的;
类似秒杀的系统怎么设计,有什么注意事项;
Redis的缓存雪崩和缓存击穿;
因为提到了降级,说说降级策略(自己给自己挖坑,面完立马去总结了);
MySQL的索引;
JVM GC的一整套(算法、分区、判断方法、GC器);
Spring的AOP和IOC的偏底层实现;
介绍Spring MVC以及其底层原理;
聊聊MQ,你项目用了RabbitMQ仔细说说底层的东西;
几十G的数据都是URL,内存空间只有1G,磁盘空间无限,统计频率最高的Top 10;
编程题:
一个SQL,和从不订购的客户一样,左连接完事;
一个判断平衡二叉树。
感受:我好垃圾,几个场景题都回答得不怎好,面试官建议多看源码。
三面
基本就是对着简历问。
编程题:
力扣88 合并两个有序数组。
感受:还是得多在白板上写代码。
第三篇
杂感:
1. 牛客网,永远滴神!(真的很感谢大家的分享)
2. 感谢github上 CyC2018(初期学习参考),SnailClimb的面试总结(面试参考对象)
面筋总结:
因为并不是每家都有做录音,忘了一些面试问题。我就贴一下我面过比较普适性的问题。 此外, 我只是做一点些关键词的提示,具体达到面试要求需要自己去详细的理解和掌握 。
一些面试问题,我在自己的有道云笔记有解答。欢迎前辈斧正。链接:http://note.youdao.com/noteshare?id=3fa30656141202169d7d99c632b261c5
JVM:
1.【高频】Java内存区域: {程序计数器,虚拟机栈,本地方法栈,堆,方法区,元空间}// 每个区域要能介绍一下
2. Minor GC触发条件: eden区剩余内存是否足够。两种情况分开分析。
FULL GC触发条件:Minor GC平均晋升空间大小 > 老年代连续剩余空间,则触发FULL GC
3.【高频】判断对象死亡的方法:{引用计数法,可达分析算法}
深入一些:GC root对象有哪些?为什么选择他们做GC root对象 ?
4.垃圾收集算法:{标记清除算法、标记整理算法、 复制算法、 分代收集算法}
深入一些: 各个算法的优点和适用场景
5.垃圾收集器:{serial、parallel、CMS、G1}
CMS、G1重点,介绍工作流程和优缺点
6.内存泄漏
例子: { 单例 , 容器 等等}
原因 : 长生命周期持有短生命周期引用
7.引用类型:{强引用、软引用、弱引用、虚引用}
8.【高频】类加载过程:{加载,连接,初始化}
有哪些类加载器,能否自定义Java.Object.String 的类加载器?
9.【高频】双亲委派机制,介绍 & 作用
Java :
1. ArrayList 和 LinkedList 的区别
2. HashMap & ConcurrentHashMap 的比较: 线程安全问题等等
深入一些:HashMap 为什么线程不安全? 能否举例 = { 并发resize()触发闭环结构 ,覆盖put操作 }
3.【高频】HashMap的相关问题// HashMap系列需要通过关键源码理解,比较重要
为什么 HashMap的size 为 2的幂次方 ?
HashMap resize()过程能否介绍 ?
HashMap效率受什么影响 (负载因子、hash数组size)?
HashMap中扰动函数的作用 ?
4. Hashtable 和 HashMap的区别:{底层数据结构 (JDK1.8后不同)、父类不同、扩容方法不同、线程上锁范围不同(重点)}
5. equals 和 == 区别
为啥重写equals要重写hashCode()
hash值相等,而两个对象不一定equals
6.【高频】String、StringBuffer、StringBuilder的区别和各自使用场景
深入一些:String是如何实现它不可变的?
为什么要设置String为不可变对象? (字节一面这个问题给我问懵了)
7.接口和抽象类区别
8.重写和重载的区别
9.深拷贝和浅拷贝区别
10.Java三大特性
11. Object的方法:{finalize、clone、getClass、equals、hashCode}
12.【高频】设计模式:{单例模式、工厂模式、装饰者模式、代理模式、策略模式 等等}(此处我的掌握也不是很好)
深入一些:单例模式为什么采用双检测机制?
单例为什么用Volatile修饰?
装饰模式和代理模式区别?
并发 :
1.线程的状态:{new,runnalbe,wait,time-wait,block,terminated }
2.进程、线程、协程的含义和区别。//个人理解是一组渐进提出的概念
3.进程间通信方式:{管道 、FIFO 、信号量、共享内存、消息队列、Socket}
4.如何避免死锁?死锁的四个必要条件
5. Sleep和wait的区别
6.【高频】Sychronized和lock的区别 ?
7. Sychronized的底层优化:{无锁、偏向锁、轻量级锁、重量级锁}
8. volatile的作用:{指令重拍、保证变量的可见性(设计JMM)}
9. ThreadLocal 底层原理
10.【高频】线程池
线程池构造器涉及哪些参数: {corePoolSize,maximumPoolSzie,timeout,timeUnit,RejectHandler,等待队列,线程工厂}
介绍线程池工作过程?
线程池拒绝策略那些?
适用Executor创建线程池的弊端?
11. AQS 框架原理和源码理解
计网 :
1.TCP/IP 模型 & OSI模型
2.应用层、传输层、网络层常见协议:{DNS、HTTP、FTP、STMP、SSL、TCP、UDP、 ARP、IP}
3.【高频】TCP 三次握手、TCP四次挥手
深入一些:为什么三次握手,能否两次?
四次挥手中什么是 time_wait 状态 ? close-wait 状态?
time_wait状态什么场景下过多,会造成什么问题?
4.TCP可靠性:{ARQ、流量控制、拥塞控制、校验和}
5.【高频】输入URL显示主页的过程//个人仅遇过一次,但是看面经感觉问的挺多
6.HTTPS和HTTP 区别// 字节专属问题
深入一些:HTTPS加密过程介绍 ?
7.Cookie和Session的区别
8.Http1.0 和HTTP1.1 和 Http2.x 的区别
9.get和post的区别
10.常见的状态码
操作系统(相对较少):
1.用户态和内核态的区别
2.fork()作用
3.Select poll epoll的区别
4.虚拟内存作用? 内存分页的作用?
5.缺页异常的介绍
6.OOM问题和 StackOverFlow的区别
MySQL:(对redis 需要学习,个人理解不深不多介绍) // MySQL比较重要
1.【高频】MyISAM和InnoDB的区别:{是否支持行锁、是否支持十五、是否支持 MVCC、底层索引结构不同 }
2.事务特性ACID
深入一些:为什么要有一致性?AID不是已经保证了一致性了吗 ?
3.并发事务带来的问题:{脏读、修改丢失、不可重复读、幻影读}
4.【高频】事务的隔离级别
5.【高频】 MVCC机制
6.【高频】索引
为什么索引使用B+树结构,而不是B树
为什么索引使用B+树结构,而不是红黑树:{磁盘预读取、红黑树高度 }
7.聚簇索引和非聚簇索引区别? 主键索引和二级索引了解吗?
8.为什么不对每个列创建索引呢?
9.【高频】SQL语句优化,SQL题目(字节要求撸代码)
10.explain中 rows、type、key、extra字段的含义?
11.count(1)、count(*)、count(列值)的区别
其他:
需要了解linux的指令和 git指令。
对一些大数据场景题需要了解。例如1亿数据取top10,1亿数据取出现频率top10,1亿URL取出重复URL
64匹马,8个跑道,最少比赛几次选出前八?等智力题(字节常考)
此外,项目相关的知识体系需要准备, 例如我的项目涉及Netty和Zookeeper,则我会去准备相应的问题。此处因人而异。
第四篇
一面:
1.问了下简历和岗位相关的项目问题
2.tcp 四次挥手协议,为什么是四次
3.b tree和b+ tree的区别
4.回表,联合索引
5.https ssl讲一下,讲一下证书签发过程
6.算法题: binary tree 每层找最大值:level order traversal(BFS)
array,先递增后递减,可能有重复,找到一个数:三次binary search,第一次找到分界点,然后分别找target number
7.进程通信方法,说下管道
二面:
1.get/post 详解 说到get一般把数据放在url上,问:是什么协议规定的,可以放在body里么?
2.说下http request 和 response
然后记得不太清楚了,就感觉问的很细,被锤的感觉
3.算法题:diameter of binary tree, DFS, bottom-up方法,感觉会有很多corner case,但其实点就在于:edges=nodes-1
一亿个shot int,sort them 点在于:short int 是2^16, 然后有范围了,就可以用count sort来做,index当作值
4.什么是前后端分离,不分离的code长啥样
5.什么是事务,transaction
三面:
1.primary language是java,所以问了static变量什么作用,放在哪里 hashmap和hashtable区别
2.rand3 () 求rand5 () 说下怎么做
3.算法题: next permutation 点在于:怎么找到需要swap的index和比他值大的index,然后,需要从swap index之后需要sort么?
不需要的,因为前两次找index的时候,保证了从右往左是ascending,所以只需要two pointers reverse就行
第五篇
一面 (5.15)
计网:
HTTP协议的报文格式
(没答出来,以为是具体的报文格式,多少个字节那些,后面再看一下,原来是 : 请求方法 URL 状态码 这些,难顶)
数据结构:
- HashMap 1.7 / 1.8 的区别
追问了:hash值的计算,为什么这样优化 - 并发用什么
- 如何高效进行数组拷贝(其实是System.arraycopy()的原理 ,没答好)
JVM:
- GC算法
新生代为什么采用标记-复制(我答了存活对象少,和其它两种算法用在新生代的缺点,但面试官好像不满意,有盆友能解答下吗?) - 对象进入老年代的各种情况
按年龄晋升默认阈值是多少(这个没答出来,印象比较深刻) - 字符串常量池在堆吗?
多线程:
- 常见锁机制
- ReetrantLock原理
- CAS底层有了解吗(只知道是硬件支持的,没看native方法的具体实现)
- ThreadLocal 原理
设计模式:
生产消费者( 问有没有实际用过,答没有就没有问了)
mysql:
update时什么锁 (next-key lock,但唯一性索引时降级为行锁,不过当时答错了)
场景:
大数据文件如何读取存储(拆分小文件,那怎么标记顺序?如何个别文件损坏怎么办?高可用问题)
这里感觉答得不好
算法:
有序数组转二叉搜索树 (思路对了,但没做出来。看了下是leetCode的easy,都不知道是太紧张还是太菜了)
二面(5.21)
- 直接算法题最大正方形 (细节写错了,用了Math.max……)
- 设计阻塞队列(不能用JDK的api,我写了个Thread的,这里感觉也没答好)
- 进程b通过某种方式,能访问进程a的内存,会有什么问题(没答好,我说会发生类似多线程的问题。拓展了一下fork的copyonwrite 技术,不过面试官不是想要这个答案)
- TCP如何保证可靠连接
- DDOS攻击(我答了SYN攻击,深入问了如何解决,关键点是什么)
- 快速判断某正整数是否1024的倍数 (非算法题,答了位操作,就没再问了)
- 项目相关
- redis的zset底层结构
- 觉得JVM哪个设计最核心(开放题吧,我答了内存分开(堆栈那些) + 双亲委派 )
技术无关
第六篇
一面:
1、一些Java基础知识。
2、倒排索引。
4、happen-before的规则?
5、volatile修饰符,synchronize锁。
6、java单例模式的实现?
7、进程与线程的区别,多进程和多线程的区别?
9、快排时间空间复杂度,最好最坏的情况,优化方案?
10、TCP的拥塞控制,具体过程是怎么样的?UDP有拥塞控制吗?如何解决?
11、讲讲了解的垃圾回收算法和回收器,什么时候执行STOP THE WORLD?
12、了解Go语言吗?
13、问项目相关的东西:负责哪个模块?有没有碰到什么问题?怎么解决的?
二面:
1、Kylin的项目架构。
2、Paxos和ZAB协议。
3、CAP理论,分区容错性的意义。
4、大表Join小表优化,如何处理数据倾斜?
5、讲一下最大堆和最小堆。
6、HDFS的读取、写入,容错处理。(源码)
7、MapReduce的过程。(第一版和第二版的)
8、MR shuffle,Spark shuffle。
9、namenode HA,脑裂,Yarn的调度机制。
10、Hive的内部表和外部表区别、数仓建模模型、数仓分层、雪花模型和星型模型。
11、了解ClickHouse吗?它与Kylin的区别?
三面:
1、LRU算法实现。(伪代码)
2、链表倒数第K个数。(讲思路)
3、一堆螺丝和螺母用最短时间匹配。(代码实现)
4、求每天浏览页面的新用户。(Hive QL实现)
5、求抖音小视频每日点击量最高的10个。(Hash + 最小堆)
第七篇
一面
1.自我介绍
2.讲一下你做的最好的一个项目,然后问问简历的其他项目,给他讲了好几个算法(项目里面确实算法比较多)
3.讲一下spring mvc的原理
5.快排的算法流程和时间复杂度?
6.什么是哈希排序?
写题:
1.三路归并算法实现
2.最长不重复子串长度
最后:
让我稍等一会儿,先别退出房间,他去看看同事有没有时间,直接二面
二面:
面试官首先先问我实习地点安排在上海没问题吗,答:比较看重机会,位置什么的都可以克服
1.自我介绍
2.问了问我的研究方向,聊了一会儿
3.操作系统的页面置换算法,详细讲了一下
写题:
1.最长上升子序列
2.从54张牌中不放回抽样,每次抽n张,你会怎么实现?算是开放性回答,没写代码,交流思路
第八篇
一面大概的问题:
- 项目中的用户注册和登录的流程是什么?
- cookie和session
- cookie的参数有哪些?
- 服务器的域名是geogle,我可以修改cookie的domain为baidu吗?(本人不清楚)
- cookie被仿造怎么办?
- MD5加密可逆吗?会被破解吗?如何破解?
- 面向对象有哪些特征?解释一下
- SSO了解吗?
- 负载均衡了解吗?
- 数据库的关系有哪些?
- 一对多怎么实现?多对多怎么实现?
- MySQL数据库有哪些类型?这些类型有什么区别?
- 了解哪些设计模式?手写一个工厂方法模式
- 手撕sql
- 反转链表
二面问题:
- 实习做了什么?
- 为什么只实习了两个月?
- 三次握手
- 滑动窗口是干什么的?
- 拥塞窗口是干什么的?
- 进程和线程有什么区别?
- 进程通信
- hashtable的理想的查找效率是多少?
- 哈希碰撞怎么解决?
- HashMap在JDK1.8中有哪些改进?
- 随机森林算法解释一下(简历上有机器学习相关的项目)
- 手撕代码:给定一个字符串数组 dict 和 一个字符串s,判断s能否由dict中的单词组成
第九篇
一面
- 4.18 一面(视频面 - 40min)
- Java 内存模型
- 两个进程的变量的地址相同,它们之间的写操作有相互的影响吗
- 进程通信的方式
- 关系型和非关系型数据库
- 事务的特点
- 原子性和一致性的实现原理(不会)
- TCP 和 IP 为什么要四次挥手
- Close_wait 状态是什么(不会)
- 甲乙轮流射箭,两个人命中靶子的概率都是0.5,谁先射中就赢,问甲获胜的概率(答案2/3)
- 算法题:给出一串数字,去掉k个数,问能形成的最小的数
二面
- 4.18 二面(视频面 - 50min)
三面
- 4.18 三面(视频面 - 55min)
- 场景题:对 HashMap rehash 的时间进行优化
- 我第一次答了:事先预估 capacity,直接申请相应大小
- 我第二次答了:扩容时仅申请数组但不拷贝,当get命中时顺便拷贝过去
- 缺点是什么(可能会生成很多数组)
- 再优化(不会)
- 手写单例模式(饿汉、DLC懒汉)
- 算法题:给出一个转义后的字符串,问原串是什么?(写得不好)
- 场景题:对 HashMap rehash 的时间进行优化