一年北漂Java妹子,上周刚面试回来后的面试总结,已收获6个of
因为在原公司待的不是很开心,然后决定裸辞了(千万不要裸辞!!!一方面心理压力比较大。另一方面也可能会被压薪资)
裸辞之后没着急找工作,因为原先做的东西比较偏底层,所以也是学习了一段时间先拿小公司练练手,大厂问的东西无外乎项目、基础、算法,这些的话楼主推荐几本书,基本问的东西都在这里面了《Redis设计与实现》、《Mysql技术内幕 InnoDB存储引擎》、《TCP-IP详解卷一》、《HTTP权威指南》、《深入理解Linux内核》、《研磨设计模式》、《数据结构与算法分析-c语言描述》机械工业的那个 我这边是应聘go的开发,学习go的话推荐《Go并发编程实战》、林海的《Go源码解析》最好源码和书一起看
这篇挺长的,抽着看吧
百度
一面
- redis和etcd的区别
-
从数据结构方面来讲 Redis支持多种数据类型(string,set,list,hash,zset)
-
从读写性能上来讲,Redis读写性能优异,并且提供了RDB、AOF持久化,而etcd v3的底层采用boltdb做存储,value直接持久化
-
从使用场景上来看,etcd更适用于服务发现,配置管理,而Redis更适用于非强一致性的需求,比如说是队列,缓存,分布式Session
-
两者都是KV存储,但是etcd通过Raft算法保证了各个节点间的数据和事务的一致性,更强调各个节点间的通信;Redis则时更像是内存式的缓存,因此来说读写能力很强。
-
Redis是c开发的,etcd是go开发的,他是源于k8s的兴起作为一个服务发现。
-
etcd v3只能通过gRPC访问,而redis可以通过http访问,因此etcd的客户端开发工作量高很多。
-
etcd的Raft算法介绍一下
-
ping指令的实现,涉及到哪些协议
-
linux的用户态和内核态,什么时候切换到内核态
-
为什么说线程的切换比协程要慢
-
redis、etcd 分布式锁的实现
-
redis string类型的底层实现
-
和c语言string的区别
-
获取字符串长度只需要O(1)的时间复杂度,程序仅需要访问SDS的len属性即可
-
c语言会产生缓冲区溢出,在Redis中如果需要对SDS进行修改时,API回显检查SDS的空间是否满足修改所需要的要求,如果不满足的话,API会自动将SDS的空间拓展到执行修改所需要的大小,然后才执行实际的修改操作
-
减少修改字符串时带来的内存重分配次数,SDS通过free属性记录未使用的字节,通过未使用空间,SDS实现了空间预分配和惰性空间释放两种优化策略。是的修改字符串长度N次最多需要执行N次的内存重分配。
-
c字符串只能保存文本数据,SDS可以保存文本或者二进制数据
二面
二面基本是场景设计题,具体忘了,有一说一百度面试体验很好,和面试官一起探讨解决的办法
之后有一道智力题吧,有10个元素存到长度为12的数组中,有两个元素重复,找出这两个元素
比如a+b通过把元素累加在进行减法运算可以得到a+b
通过累乘再进行除法运算可以得到a*b的值
考虑到假如元素溢出,那么可已通过平方累加得到a2+b2的值
根据关系式可以求得a,b的值
三面
-
go和java的区别
可以从多个角度来讲 比如面向对象来说,多态继承等等
从运行速度来讲,go的并发模型 channel和goroutine
从包管理来讲,go mod 包括之前的dep等等 -
go的gmp调度原理
-
cpu的上下文切换问题
-
channel有无缓冲槽的区别
主要还是从同步和异步来讲 -
redis的zset实现
-
负载均衡实现
几道算法题 现场手写的
堆排的一道问题,string化整型,链表反转
四面
手写了两道算法,单链表的中间节点 一道dp题目 百度的算法题目都是easy到meduim级别的
然后对项目问的比较细,比如在实现的虚拟链路中keepalive是怎么实现的啊,有什么可以优化的点吗
怎么查找程序的性能瓶颈等等
最新2020整理收集的一些面试题(都整理成文档),有很多干货,包含mysql,netty,spring,线程,spring cloud、jvm、源码、算法等详细讲解,也有详细的学习规划图,面试题整理等,需要获取这些内容的朋友关注作者简书【AI乔治】,然后打开作者个人简介按照下图操作扫码免费获取资料-添加备注【简书】即可
滴滴 自动驾驶Vovager
一面
主要是项目和部分基础知识这里记不太清了
算法 剑指63 股票问题
dp[i]=max(dp[i-1],num[i]-num[j])
`func maxProfit(prices []``int``) ``int` `{`
`size := len(prices)`
`if` `size==``0``||size==``1``{`
`return` `0`
`}`
`profit := ``0`
`cost := prices[``0``]`
`for` `i := ``1``; i < size; i++ {`
`cost = min(prices[i], cost)`
`profit = max(profit, prices[i]-cost)`
`}`
`return` `profit`
`}`
问了能不转py
二面
二面主要问了项目以及一道算法题和场景设计题,我个人觉得不具有总结性
三面
*epoll和poll的区别
三面送命了,顺时针打印矩阵,一般按层模拟就好了,我也不知道怎么脑子就抽了
`func spiralOrder(matrix [][]``int``) []``int` `{`
`if` `matrix == nil || len(matrix) == ``0` `|| len(matrix) == ``0` `{`
`return` `[]``int``{}`
`}`
`top := ``0`
`hsize := len(matrix)`
`lsize := len(matrix[``0``])`
`left := ``0`
`bottom := hsize - ``1`
`right := lsize - ``1`
`index := ``0`
`x, y := ``0``, ``0`
`sum := make([]``int``, hsize*lsize)`
`for` `bottom >= top && right >= left {`
`for` `x = left; x <= right; x++ {`
`sum[index] = matrix[top][x]`
`index++`
`}`
`for` `y = top + ``1``; y <= bottom; y++ {`
`sum[index] = matrix[y][right]`
`index++`
`}`
`if` `bottom > top && right > left {`
`for` `x = right - ``1``; x > left; x-- {`
`sum[index] = matrix[bottom][x]`
`index++`
`}`
`for` `y = bottom; y > top; y-- {`
`sum[index] = matrix[y][left]`
`index++`
`}`
`}`
`left++`
`right--`
`top++`
`bottom--`
`}`
`return` `sum`
`}`
最新2020整理收集的一些面试题(都整理成文档),有很多干货,包含mysql,netty,spring,线程,spring cloud、jvm、源码、算法等详细讲解,也有详细的学习规划图,面试题整理等,需要获取这些内容的朋友关注作者简书【AI乔治】,然后打开作者个人简介按照下图操作扫码免费获取资料-添加备注【简书】即可
Aibee
一面
-
数组中找出和为k的两个元素返回下标 模板题了
另一道有意思的题目可以参考leetcode 560题 -
无头结点的链表元素删除
-
排行榜的设计
-
https加密过程
-
InnoDb的索引模型 详细一些
-
覆盖索引和非覆盖索引的区别
二面
算法和股票差不多
根据项目延伸来问的一些问题
-
slice的底层实现
-
gmp调度模型
-
golang的gc回收
-
tcp的粘包问题
-
mysql隔离级别
三面
没啥好说的 和面试官互相吹牛逼了
最新2020整理收集的一些面试题(都整理成文档),有很多干货,包含mysql,netty,spring,线程,spring cloud、jvm、源码、算法等详细讲解,也有详细的学习规划图,面试题整理等,需要获取这些内容的朋友关注作者简书【AI乔治】,然后打开作者个人简介按照下图操作扫码免费获取资料-添加备注【简书】即可
小米
一面
-
Redis缓存策略
-
分布式CAP原理
-
Mysql事务的隔离级别 分别解决了哪些问题?
-
mysql的存储引擎的区别?
-
Redis持久化的区别
-
Grpc的过程
二面
怼了项目 业务上不合适
-
怎么限制goroutine的数量?
-
redis为什么快?
字节跳动
一面
-
https的过程
-
客户端请求网址,服务器接收到请求后返回证书公钥
-
客户端验证证书的有效性和合法性,然后生成一个随机值
-
客户端通过证书的公钥加密随机值,将加密后的密钥发送给服务器
-
服务器通过私钥解密密钥,通过解密后的密钥加密要发送的内容
-
客户端通过密钥解密接受的内容
-
-
http keep-alive的作用
-
755 是什么权限? 详细见linux权限入门
7=rwx=4+2+1 5=rx
拥有者可读可写可执行 群组可读可执行 其他组可读可执行 -
linux 查找当前文件后20行
tail -n 20 filename -
linux统计字符出现的个数
grep -o objStr filename|wc -l -
epoll和poll的区别
本质都是IO多路复用 -
算法题 10进制转7进制
-
算法题 判断数独的有效性
二面
撕AVL树 撕哈希表
最新2020整理收集的一些面试题(都整理成文档),有很多干货,包含mysql,netty,spring,线程,spring cloud、jvm、源码、算法等详细讲解,也有详细的学习规划图,面试题整理等,需要获取这些内容的朋友关注作者简书【AI乔治】,然后打开作者个人简介按照下图操作扫码免费获取资料-添加备注【简书】即可
知乎
一面
项目
-
redis的多集群方案
-
mysql的b+索引
-
golang的内存分配机制
-
golang的多态实现
-
interface的底层实现
二面
只问了两道算法
连续子序列的最大和并返回所有序列
另一道忘了
三面
-
非递归形式的前序遍历
-
k个有序链表合并
项目问题
-
golang的context包
-
string类型转为[]byte过程发生了什么
-
redis的数据类型及底层实现
-
mysql聚集索引和非聚集索引底层实现
-
b+树和红黑树
腾讯
一面
之前看面经听说腾讯面试官惜字如金,果真就想几个字骗一段话啊
-
golang的多路复用
-
fasthttp为什么快
-
pprof使用
-
性能调优怎么做
-
http2.0的多路复用怎么实现的
-
最大连续子序列和
-
mysql怎么监控流量
-
golang调度 能不能不要p
-
负载均衡哪些算法?
二面
二面基本围绕项目拓展来说的 人家说你简历写的我不问。。
场景设计 秒杀、抽奖、推荐 三剑客
etcd和zk的区别
etcd的Raft算法详细讲一下
三面
项目细问包括一些基础问题没啥好讲的
职业规划等等
BIGO
-
prometheus实际使用
-
linux tcp 半连接
-
常见的linux指令
tail pwd chmod lsof netstat top -
实现一个压测工具
golang编写一个http客户端,支持参数httprequest -c 5 -r 1000 http://**** 客户端,输出所有响应 -
string类型加法实现
-
sql题
`CREATE TABLE IF NOT EXISTS `mytable` (`
``id` bigint(``20``) unsigned NOT NULL AUTO_INCREMENT,`
``video_id` bigint unsigned NOT NULL DEFAULT ``0``,`
``uid` ``int` `unsigned NOT NULL DEFAULT ``0``,`
``country` varchar(``194``) NOT NULL ,`
````class``` varchar(``64``) NOT NULL ,`
``status` tinyint(``4``) unsigned NOT NULL DEFAULT ``'0'``,`
``video_view` bigint(``20``) unsigned NOT NULL DEFAULT ``'0'``,`
``created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,`
`PRIMARY KEY (`
``id``
`)`
`) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;`
`SELECT * FROM mytable WHERE created > ? AND ``class` `= ? AND country IN (?) ORDER BY created DESC LIMIT ``100``;`
`SELECT * FROM mytable WHERE ``class` `= ? AND country IN (?) ORDER BY video_view DESC LIMIT ``100``;`
`SELECT * FROM mytable WHERE created > ? AND ``class` `IN (?) LIMIT ``100``;`
`SELECT * FROM mytable WHERE created > ? AND country IN (?) LIMIT ``100``;`
怎么建索引?
-
map如何实现顺序读取
空间换时间
借助额外的数据结构比如slice 等,对key进行排序,遍历slice得到顺序输出 -
协程泄***r>如果你启动了一个 goroutine,但并没有符合预期的退出,直到程序结束,此goroutine才退出,这种情况就是 goroutine 泄露。当 goroutine 泄露发生时,该 goroutine 的栈(一般 2k 内存空间起)一直被占用不能释放,goroutine 里的函数在堆上申请的空间也不能被 垃圾回收器 回收。
-
空结构体的用处
空结构体不占用内存空间-
实现set
-
实现chan struct{} 不占用内存空间,实现传递信号的通道
剩下的忘了一直在看表了想着还不结束, 面了两个小时
-
最新2020整理收集的一些面试题(都整理成文档),有很多干货,包含mysql,netty,spring,线程,spring cloud、jvm、源码、算法等详细讲解,也有详细的学习规划图,面试题整理等,需要获取这些内容的朋友关注作者简书【AI乔治】,然后打开作者个人简介按照下图操作扫码免费获取资料-添加备注【简书】即可
面试总结
不知道你们看完了发现没,就一个百度,就要懂很多知识点,那如果阿里巴巴,支付宝,华为、等一线大厂呢?是不是感觉自己还要学习的还有很多~
经过这次面试,我总结一下几点:
1、基本语法
这包括static、final、transient等关键字的作用,foreach循环的原理等等。今天面试我问你static关键字有哪些作用,如果你答出static修饰变量、修饰方法我会认为你合格,答出静态块,我会认为你不错,答出静态内部类我会认为你很好,答出静态导包我会对你很满意,因为能看出你非常热衷研究技术。
2、集合
非常重要,也是必问的内容。基本上就是List、Map、Set,问的是各种实现类的底层实现原理,实现类的优缺点。集合要掌握的是ArrayList、LinkedList、Hashtable、HashMap、ConcurrentHashMap、HashSet的实现原理,能流利作答,当然能掌握CopyOnWrite容器和Queue是再好不过的了。另外多说一句,ConcurrentHashMap的问题在面试中问得特别多,大概是因为这个类可以衍生出非常多的问题,关于ConcurrentHashMap,我给网友朋友们提供三点回答或者是研究方向:
(1)ConcurrentHashMap的锁分段技术
(2)ConcurrentHashMap的读是否要加锁,为什么
(3)ConcurrentHashMap的迭代器是强一致性的迭代器还是弱一致性的迭代器
3、设计模式
设计模式在工作中还是非常重要、非常有用的,23种设计模式中重点研究常用的十来种就可以了,面试中关于设计模式的问答主要是三个方向:
(1)你的项目中用到了哪些设计模式,如何使用
(2)知道常用设计模式的优缺点
(3)能画出常用设计模式的UML图
4、多线程
这也是必问的一块了。会问得深入一些比如说Thread和Runnable的区别和联系、多次start一个线程会怎么样、线程有哪些状态。当然这只是最基本的,出乎意料地,几次面试几乎都被同时问到了一个问题,问法不尽相同,总结起来是这么一个意思:假如有Thread1、Thread2、Thread3、Thread4四条线程分别统计C、D、E、F四个盘的大小,所有线程都统计完毕交给Thread5线程去做汇总,应当如何实现?
聪明的网友们对这个问题是否有答案呢?不难,java.util.concurrent下就有现成的类可以使用。
另外,线程池也是比较常问的一块,常用的线程池有几种?这几种线程池之间有什么区别和联系?线程池的实现原理是怎么样的?实际一些的,会给你一些具体的场景,让你回答这种场景该使用什么样的线程池比较合适。最后,虽然这次面试问得不多,但是多线程同步、锁这块也是重点。synchronized和ReentrantLock的区别、synchronized锁普通方法和锁静态方法、死锁的原理及排查方法等等
5、IO
IO分为File IO和Socket IO,File IO基本上是不会问的,问也问不出什么来,平时会用就好了,另外记得File IO都是阻塞IO。Socket IO是比较重要的一块,要搞懂的是阻塞/非阻塞的区别、同步/异步的区别,借此理解阻塞IO、非阻塞IO、多路复用IO、异步IO这四种IO模型,Socket IO如何和这四种模型相关联。这是基本一些的,深入一些的话,就会问NIO的原理、NIO属于哪种IO模型、NIO的三大组成等等,这有些难,当时我也是研究了很久才搞懂NIO。提一句,NIO并不是严格意义上的非阻塞IO而应该属于多路复用IO,面试回答的时候要注意这个细节,讲到NIO会阻塞在Selector的select方法上会增加面试官对你的好感。如果用过Netty,可能会问一些Netty的东西,毕竟这个框架基本属于当前最好的NIO框架了(Mina其实也不错,不过总体来说还是比不上Netty的),大多数互联网公司也都在用Netty。
6、JDK源码
要想拿高工资,JDK源码不可不读。上面的内容可能还和具体场景联系起来,JDK源码就是实打实地看你平时是不是爱钻研了。
JDK源码其实没什么好总结的,纯粹看个人,总结一下比较重要的源码:
(1)List、Map、Set实现类的源代码
(2)ReentrantLock、AQS的源代码
(3)AtomicInteger的实现原理,主要能说清楚CAS机制并且AtomicInteger是如何利用CAS机制实现的
(4)线程池的实现原理
(5)Object类中的方法以及每个方法的作用
7、框架
老生常谈,面试必问的东西。一般来说会问你一下你们项目中使用的框架,然后给你一些场景问你用框架怎么做,比如我想要在Spring初始化bean的时候做一些事情该怎么做、想要在bean销毁的时候做一些事情该怎么做、MyBatis中$和#的区别等等,这些都比较实际了,平时积累得好、有多学习框架的使用细节自然都不成问题。
如果上面你的问题答得好,面试官往往会深入地问一些框架的实现原理。问得最多的就是Spring AOP的实现原理,当然这个很简单啦,两句话就搞定的的事儿,即使你不会准备一下就好了。
8、数据库
数据库十有八九也都会问到。一些基本的像union和union all的区别、left join、几种索引及其区别就不谈了,比较重要的就是数据库性能的优化,如果对于数据库的性能优化一窍不通,那么有时间,还是建议你在面试前花一两天专门把SQL基础和SQL优化的内容准备一下。
不过数据库倒是不用担心,一家公司往往有很多部门,如果你对数据库不熟悉而基本技术又非常好,九成都是会要你的,估计会先把你放到对数据库使用不是要求非常高的部门锻炼一下。
9、数据结构和算法分析
数据结构和算法分析,对于一名程序员来说,会比不会好而且在工作中绝对能派上用场。数组、链表是基础,栈和队列深入一些但也不难,树挺重要的,比较重要的树AVL树、红黑树,可以不了解它们的具体实现,但是要知道什么是二叉查找树、什么是平衡树,AVL树和红黑树的区别。
10、Java虚拟机
Java虚拟机应该是很重要的一块内容,谈谈Java虚拟机中比较重要的内容
ava虚拟机的内存布局
GC算法及几种垃圾收集器
类加载机制,也就是双亲委派模型
Java内存模型
happens-before规则
volatile关键字使用规则
也许这些内容面试无用,但在走向大牛的路上,不可不会。
11、Web方面的一些问题
Java主要面向Web端,因此Web的一些问题也是必问的。
谈谈分布式Session的几种实现方式?(常用的四种能答出来自然是让面试官非常满意的)
讲一下Session和Cookie的区别和联系以及Session的实现原理
这两个问题之外,web.xml里面的内容是重点,Filter、Servlet、Listener,不说对它们的实现原理一清二楚吧,至少能对它们的使用知根知底。另外,一些细节的方面比如get/post的区别、forward/重定向的区别、HTTPS的实现原理也都可能会被考察到。
最后,如果有兴趣有时间,建议学习、研究一下SOA和RPC,面向服务体系,大型分布式架构必备,救命良方、包治百病、屡试不爽。
最新2020整理收集的一些面试题(都整理成文档),有很多干货,包含mysql,netty,spring,线程,spring cloud、jvm、源码、算法等详细讲解,也有详细的学习规划图,面试题整理等,需要获取这些内容的朋友关注作者简书【AI乔治】,然后打开作者个人简介按照下图操作扫码免费获取资料-添加备注【简书】即可