从去年七月到现在,我从一个很菜的菜鸡变成了一个有offer的菜鸡。
今年春招拿了oppo 、vivo、拼多多、成都头条的offer,现在已经是心满意足了,打算上岸了。
首先废话不多说,最近刷牛客很多人因为简历筛选就挂了,这里附上我自己的简历。(至少头条、拼多多的简历筛选都过了)
一般来说,很多公司对了解分布式的人是很感兴趣的,只要你的简历上写了了解分布式,一般都会问到。其实我会的分布式知识也就几个:分布式锁、分布式事务、Dubbo、Zookeeper。这些里面只要了解一些基本都算是加分项。在刚学的时候,觉得分布式只是很难,其实静下心来学,也没有那么难。差不多一个月左右可以基本掌握。
分布式锁:使用数据库怎么实现?使用Redis怎么实现?使用Zookeeper怎么实现。各种实现有什么问题?比如锁泄露、可重入这些问题。这里就不一一讲解了,因为网上一搜分布式锁,讲的都很详细。
分布式事物:二段提交、TCC、本地消息表。这三种会出现各种的优缺点?这里看下博客也就基本都没问题
Dubbo:学习Dubbo主要看官方文档,官方文档写的非常好,里面从Dubbo的基础再到实现细节。个人感觉最好的模块是Dubbo中文网站的源码导读模块。
这里静下心来看,很容易看懂,把大致思路看懂了,面试基本没什么问题。
Zookeeper:Zookeeper其实了解起来很简单。买本书来看一下,几天就会。
上面这些东西都学得差不多了,分布式知识的基础也就起来了。后面的消息队列什么的我也还没学,就不多说。学会这些的好处上面已经说了,面试官对分布式知识很感兴趣,基本你写就会被问到。
然后是项目,针对项目而言,一般来说简历上写两个项目左右就够了,大多数面试官一般会让你挑一个最好的项目来说。所以多写无意义(当然是针对我这种做的项目不太好的人而言)。所以尽可能的优化你的某一个项目,多使用一些能吹的技术。就比如我的项目写了数据库主从同步,首先为什么要用主从?为什么要读写分离?什么时候读写分离好?Mysql主从原理?线程模型?......这些基本都要掌握。或者说线程池,线程池原理、操作流程、拒绝策略、为什么使用线程池(好处)、线程池种类(Fixed、Single、Cached....),这些不同种类的线程池具体怎么实现的?使用与什么场景?
基本上来说,面试官让你介绍项目的时候,主动权就在你这边,你需要将你项目使用的技术、优化点都说出来,然后引导面试官向某一个方向问问题。比如你提到了用了线程池,很多面试官也就会问你线程池的问题。
然后分享一下自己自我介绍的套路:一般来说,自我介绍先介绍名称、学校、专业,然后是自己做的方向(比如Java后端)。这些完了以后介绍自己学习的东西,比如java,从基本的语法到Jvm,java高并发(给面试官抛出一些可以问的东西),然后是框架、提一下项目.....
上面这些都挺套路的,套路完了,还是要看基本功。对于Java开发来说,JVM是一个必备知识点。JVM内存模型,哪些是线程私有的?虚拟机栈栈帧对应什么?虚拟机栈中局部变量表、操作数栈、动态链接等都有什么作用?这里提一下,动态链接是相对于静态解析而言的,静态解析也就是在类加载阶段有一个解析阶段,是将符号引用转化为直接引用,但是在这个阶段不一定能完全解析方法地址,也就是在不能判断方法执行版本时,比如重载的方法时,就需要靠动态链接来找到对应方法。或者说堆的结构,如何划分?Eden、To Survivor、From Survivor作用各是什么?GC时这些部分有什么功能?比如一个面试官让你介绍GC,首先应该介绍什么样的对象会被GC,这里就要介绍引用计数法和可达性分析法。然后是GC算法,各个算法优缺点,然后是垃圾收集器,一般来说主要了解CMS和G1,当然其它能了解最好也要了解。然后就是JVM调优,jvm参数、调优命令:jstat、jmap、jstack、jps等等。最好自己用一下。后面的至于类加载机制、双亲委派模型都可以通过《深入理解Java虚拟机》这本书了解。
然后是Java高并发,一般来说,很多时候面试官会让写单例模式,我自己写的一般都是volatile 双重检查加锁的形式。主要原因在于这里可以引入介绍volatile和synchronized。volatile保证有序性和可见性。有序性很简单,就是内存屏障,禁止指令重排序。可见性一般来说我会结合缓存一致性协议来说,MESI,具体深入对具体的处理器中的缓存条目进行操作,然后处理器和总线通信等等。这里可以参考《java多线程编程实战指南》,讲的很详细。然后是synchronized关键字的锁的实现,和Lock的区别,做出的优化:适应性自旋锁、偏向锁、轻量级锁,锁什么条件下回升级?这些说完,Lock的实现?AQS?可重入实现?读写锁实现?这些可以参考《java并发编程的艺术》这本书,讲的非常详细、基本从源码的角度来说。总之java并发可以问的问题很多,我个人主要就看了以上我提到的两本书,不会的地方上网查查就行。
再然后是java集合。一般来说集合主要了解ArrayList、LinkedList,它们之间的区别。HashMap、Maps.synchronizedMap、ConcurrentHashMap。针对于HashMap,需要了解1.8优化使用了红黑树和尾插法。然后是需要详细介绍put get resize三个操作,难点在resize,比如当前节点在新的数组会映射到哪一个位置?怎么判断?然后是ConcurrentHashMap使用的分段锁,继承可重入锁实现,1.8使用synchronized关键字 CAS操作实现。上面这些最好都读源码。Set的话一般都是参考Map来实现的,也就是只使用Map的key来存取值。
操作系统,进程线程、进程状态——用户态转内核态,为什么要转?虚拟内存?死锁?进程通信?
计网,TCP和UDP,主要了解三次握手四次挥手,为什么三次,为什么四次?为什么挥手后要等待2MSL才中断?TCP快速重传、滑动窗口、流量控制、拥塞控制、慢启动机制等。一般来说面试官应该对拥塞控制和流量控制更感兴趣。HTTP请求格式,请求行、请求头,请求方法?RESTFUL?请求状态码?HTTPS,对称加密和非对称加密?以非对称加密的方式传递对称加密的秘钥。
然后是Mysql,Mysql要求基本的增删改查语句都要会。然后一般来说Mysql的调优(怎样排查执行慢的sql):慢查询日志、explain分析查看是否走索引,没有索引创建索引,有的话判断索引为什么失效?索引什么时候会失效?最左匹配原则、or条件两边有一边没有使用索引、字段类型隐式转换、like以%开头、表中数据较少导致全表比索引快,这些条件都会导致索引失效。索引的底层实现?介绍B 树?这里主要先介绍BST二叉搜索树,然后从磁盘I/O的角度介绍B树。然后介绍B 树所做的优化,即非叶子节点值存储key,这样这些节点可以存储更多key,也就降低树高度,减少I/O次数;叶子节点以链表形式连接,方便范围搜索。然后是聚簇索引和非聚簇索引。一般来说聚簇索引B 树的叶子节点存储的数据,非聚簇索引叶子节点存储指针,所以非聚簇索引要多一次I/O操作才能读取到数据。最后就是Mysql的主从,主从原理和机制。Mysql我看的书是《深入浅出Mysql》,上面索引讲的不多,还需要自己看博客。
Redis,redis只用一本书就够了,《Redis的设计与实现》。拓展问题有缓存穿透和缓存雪崩?怎么解决?缓存穿透可以使用布隆过滤器、缓存雪崩可以设置随机过期时间。
算法方面,了解数据结构以后就刷leetcode或者《剑指offer》吧。
我会的基本也就这些了。总的来说,我是从去年7月份开始从零开始学的,已经算是很晚了。现在牛客的你们所有人都应该比当时的我强吧。从开始学习,相继看了《Head First Java》、《Head First 设计模式》、《深入理解Jvm》、《Java EE互联网轻量级框架整合开发— —SSM框架》、《java多线程编程实战指南》、《java并发编程的艺术》、《数据结构与算法》、《Redis设计与实现》、《大型网站技术架构》、《剑指offer》、《ZooKeeper:分布式过程协同技术详解》、《深入浅出Mysql》等等。我认为学习技术不能单了解别人所说的就可以了,最主要是要问为什么。还有就是要沉下心来学习,不断的向前行。
这里附上拼多多和头条面经,其它面经我以前发过
拼多多:
一面:
上来就问,我看你笔试题做的,第一题你的思路是什么,为什么要这么做?自己推到过公式吗?
我:这个当时随便写了两个用例,自己算了一下,感觉就是这样做。具体没推导过。
那有一题我看你没做出来,下来以后看过吗?
我:因为当时没在学校,所以做了以后没时间看。(说道这里感觉有点凉)
有一个10G的文件,里面是数字,怎么排序?
我:外部排序,分为多个文件,对这些文件读入内存进行排序,可以使用归并。得到多个排序好的文件以后将这些文件合并。具体比如分为10个文件,那么就维护10个指针,每次取最小值写入新文件中,最终可以得到。
HashMap介绍下
我:blabla。
准备的还挺充分,如果让你自己设计一个Dubbo的消费者,你怎么设计?
我:这里应该是问dubbo的消费这怎么实现的。讲了下具体流程
Lock和synchronized
我:Lock底层使用了CAS实现,synchronized使用操作系统互斥锁实现
它们之间的使用场景限制
我:对于跨方法加锁和解锁,不能使用synchronized,比如在第一个方法加锁,第二个方法解锁。还有就是synchronized不可响应中断
介绍项目
我:blabla,提到了线程池
介绍线程池
我:线程池的流程、拒绝策略,几种线程池
.....后面就忘了
二面:(只面了25分钟)
自我介绍
项目
数据库调优
我:慢启动日志、explain分析、索引失效
数据库隔离级别
我:读未提交、读已提交、可重复读、序列化
可重复读主要解决了什么问题?
幻读?
我:....,其实Mysql中,在可重复读的隔离级别中,已经解决了一些幻读的问题。Mysql可重复读是基于Mysql的锁来实现的。Mysql中有行锁和间隙锁。在可重复读的隔离级别下,Mysql不仅会对相应的行进行加锁,还会对间隙加锁。这样也就消除了幻读的问题
Redis持久化
我:RDB和AOF,save和bgsave命令,save当前进程持久化,这段时间不能接受新请求。bgsave创建子进程,不影响当前进程。AOF追加。介绍了AOF重写。
.....
头条:
一面:
给你一个已经排序的数组,找到一个元素第一次出现的位置,{1,2,3,3,3,3,4},输出2
我:一直二分,考虑边界
HashMap
TCP介绍
我:可靠数据传输、三次握手、四次挥手、流量控制、拥塞控制.....
使用Zookeeper作为Dubbo注册中心时,Zookeeper结构是什么?(这个Dubbo官网有)
数据库索引及实现
我:介绍B 树
....
二面:
手写单例
你用了volatile,volatile介绍
我:有序性和可见性
Jvm内存模型
Dubbo介绍
我:从服务暴露到服务消费流程,中间提到了SPI机制以及自适应拓展机制
一致性Hash
我:值了解过Dubbo负载均衡里面的一致性hash,介绍了一遍(这里Dubbo源码导读里也有)
二段提交
我:资源管理器、事物管理器,了解Mysql事物二段提交操作,prepare,commit,rollback
二段提交有什么问题
我:最主要的是单点问题
怎么解决?
我:心跳机制?各个资源管理器建立连接?
不对
我:第三方监控?类似于Redis里的哨兵?
对了
三面:
2T文件,有uid,uname。3T文件,有uid,utext。要求将两个文件uid相同的整合。
我:使用hash,将这些文件进行散列,相同uid会散列到相同文件,然后使用hashmap进行整合
那如果我的hash散列不均匀?全部散列到一个文件?
我:可以排序(面试完发现忘了再散列这种方法)
面试官有点失望,问下一个问题。(手撕)给你一个User,包含id,name,parentId。然后给你一个List
我:(一开始完全不会)先写找到跟节点,然后找到这个根节点的子节点。找到子节点以后发现将这些子节点进行递归就建立起来了
一张表有ABC三个字段。现在要查BA,BC,B,问怎么建立索引?
我:最左匹配原则,BA,BC
......
潜了这么久水,回馈一下牛客
许愿爱奇艺!
大三双非一本
爱奇艺上海java实习生
面试官是个超级温柔和善的男生
大概总结一下这次面试问题
hashmap讲一下 resize做了啥
2 倍扩容,随机放元素位置
ArrayList和LinkedList讲一下
数组和链表
讲一下spring,springmvc,springboot(概述,常用注解)
spring IOC,AOP
AOP原理
静态***和动态***讲一下
java反射讲一下
java序列化(这个我真的不会。。。)
lock和synchronized区别
ACID讲一下
脏读,不可重复读,幻读
MVCC,CAS
ABA问题,解决
乐观锁,悲观锁,行锁读写锁,表锁
讲一下Redis
JVM分区
垃圾回收讲一下
对象是否存活
垃圾回收俩次标记(忘了。。。)
讲一下JMM
happens-before,举个例子
分布式消息队列之类的我都没有深入学习,面试官也没问啥
3.12-4.12,历时一个月,终于收到阿里云Java研发实习的录用意向书,可以说这是本次春招真正意义上的第一个offer,大概也会是最后一个offer了吧,本人渣渣211本科菜鸡一枚,能够收到阿里的录用意向书纯属侥幸,为感谢广大牛油的贡献,特放出我在本次春招面试各公司的辛酸经历,供各位有需要的牛油参考。(因为时间比较久了,我很多都不记得了,放出来的只是我记得的部分,不是全部)
1、进程通信方式,共享内存原理
2、TCP拥塞控制原理
3、TCP可靠数据传输原理
4、TCP与UDP的区别,各自的应用情景
5、数据库聚簇索引与非聚簇索引原理
6、C Map实现原理,查找时间复杂度
7、Java HashMap实现原理,查找时间复杂度
8、HashMap多线程插入是否线程安全(各自Key不相同),为什么
9、快排时间复杂度是O(nlogn)的原因,最坏时间复杂度是什么,原因,如果优化
10、进程与线程的区别
11、进程内存区域划分(数据区、代码区......),哪些是线程共享,哪些是线程独占
12、物理地址与逻辑地址的概念,换算关系
13、select/epoll原理
代码题:
1、3×7表格,从左上到右下,每次只能向右或向下,总共路径有多少条(leetcode原题),我用了深度遍历递归实现,然后问时间复杂度是多少,怎么优化
2、实现一种排序算法
以上问题不是提问顺序。
1、简历项目相关问题(15min)
2、TCP拥塞控制原理(基础知识 5-10 min)
3、TCP可靠数据传输原理
4、volatile和synchronized的区别
...(不记得还有什么问题了)
开放性问题:(15min)
我所在的区大概有多少条公路?大概有多少个加油站?怎么分布?为什么?
代码题:(20min)
快排实现,写好发邮箱
1、都知道什么排序算法,讲一下堆排序,应用场景,讲一下快速排序
2、HashMap原理,红黑树讲一下(自己挖的坑)
3、concurrenthashmap原理
4、ThreadLocal应用场景,原理
5、String等号比较
6、innodb索引原理
7、红黑树与平衡树的区别,各自的应用场景
8、两个大文件里面有很多字符串,找出交集
1、Java是值传递还是引用传递,为什么
2、new一个对象的过程
3、JVM内存区域划分,各自的作用
4、堆空间的划分,为什么这样分
5、垃圾收集算法
6、concurrenthashmap原理
7、TCP三次握手,为什么需要三次握手
8、TCP拥塞控制原理
9、滑动窗口原理
10、TCP网络攻击
11、TIME_WAIT什么情况下会出现,为什么
12、http状态码
13、post和get的区别
14、网络攻击是否有了解?sql注入原理,如何防止(自己挖的坑)
15、SpringMVC和Servlet的区别
16、地址空间的作用
17、进程通信方式,各自应用场景
18、进程与线程的区别
19、MySQL索引原理,慢查询优化,如何合理建索引
20、两个栈实现一个队列(剑指offer原题)
21、两数之和(剑指offer原题)
22、青蛙跳台阶问题(剑指offer原题)
1、java基础,很多,也很常规,所以不太记得了
2、JVM内存模型,垃圾回收算法
3、线程池参数及作用
4、有一个线程占用CPU很高,如何查出来,如何打印堆栈信息
5、如何打印一个线程的内存占用信息
6、JVM工具及用法
7、一百亿个数排序?(反正就是很多个数排序,多少不记得了)
8、k个有序链表排序成一个有链数列,代码实现,不用跑得通,讲思路
9、concurrenthashmap原理
10、ICMP处于哪一层
11、TCP三次握手
12、TCP四次挥手
13、页式和段式内存管理
14、volatile关键字讲一讲
15、TCP关闭的closing状态
(4.16更新,已挂)
蘑菇街面试基本不问基础知识,就是从你的简历中的项目提问,比如我简历上写了一个web项目,里面有权限管理,然后问怎么实现,然后项目遇到的挑战什么的。蘑菇街一面给我的体验是最好的,就问了几个基础知识,然后问项目,然后给你提出改进的思路,而且是慢慢的引导你往改进的思路去想,然后就是场景题,如果你给的方案不够好的话也会慢慢引导你去优化。
--------------------------------------------------------分割线-----------------------------------------------------
1、简历项目相关(10-15 min)
2、传输层与网络层的区别
3、ping使用的协议,处于哪一层
4、TCP三次握手
5、TCP四次挥手
6、last_ack阶段
7、java函数值传递还是引用传递,为什么
值传递
8、JVM内存模型
9、full gc时机
...线程相关问题,都是结合场景来提问,我不知道怎么描述
10、java互斥锁(synchronized和lock的区别)
代码题:
不是算法题目,是一道多线程的题目,两个猴子,n个苹果,一个一次拿两个,一个一次拿三个,直到苹果不够两个人中的任何一个拿的时候就停止,后面要解释一下结果,然后改进,不要让其中一个猴子连续拿很多次
1、简历项目,比赛相关
2、浏览器输入URL之后到内容返回的整个过程
3、Linux命令(find命令)
4、TCP三次握手
5、TCP传输过程中出现丢包怎么处理
......
感觉还是比赛和项目相关聊的时间比较长,基础没怎么问
1、实现一个后端的异步服务框架(实现思路)
2、GC机制
3、内存泄漏举例
4、乐观锁与悲观锁
5、简历项目相关的问题
6、专业相关的问题(我是网络工程专业)
7、设计一个服务,提供一个接口,为请求这个接口的用户返回一个B类IP地址,响应越快越好(即支持多并发访问),设计方案
......
感觉这一面主要聊一些场景的方案设计的时间比较长
1、简历项目相关
2、TCP拥塞控制原理
3、有了解过Linux kernel里面常用算法
4、专业相关的问题(我是网络工程专业)
5、迪杰斯特拉最短路径算法
6、矩阵连乘问题(动态规划中的矩阵连乘问题)
7、ThreadLocal使用场景,原理
8、ConcurrentHashMap原理
......
这一面面得极差,面得我都要哭了,因为等这一面我等了一周,而且是晚上十点多才等到的电话,那时候心情特别低落,所以很多问题答的一塌糊涂
常规问题,就面了十来分钟