分享下菜鸡的Java秋招总结
前言
本人21届双非本科,在大二的时候开始学习Java,来到牛客也有一年多的时间了,首先很感谢大佬们的知识分享,帮助我提升了很多,也要感谢我的恋爱6年之久的女朋友哈(她也是Java🤣),一同经历了一年多的努力,互相理解互相鼓励,秋招也都算一起拿到了满意的offer(有赞、网易、京东、美团、奇安信、蘑菇街、58等),虽然没有像大佬们一样拿了很多大厂,但对于我们双非本已经心满意足了😅但是随着9月初自己结束秋招之后,就一直没能好好学习,每天打球,玩游戏😤,所以打算从今天开始,就要回归以往的学习状态之中啦!以下分享一下个人的一些总结!大佬勿喷哦🤣!
关于校招
大家都知道每年都有春招和秋招两次招聘 ,春招一般在2月中旬就陆续开始了,面向的是 本届应届生招聘 和 次届的暑期实习生招聘,对于应届生招聘,可能春招的招聘力度与hc是没有秋招多的,据我了解大多数应该是大佬们秋招拒了很多offer后的补录名额,可能竞争会相比与秋招更加激烈(楼主盲猜,欢迎指正)?但是春招对于次届毕业生而言,个人觉得是进入大厂的好机会,各大公司会招聘暑期实习生,面试难度会比秋招小一些,转正的概率还是很大的,也就是说人家还在忙于秋招,你已经转正结束秋招了(身边有几个朋友就是转正在大厂了)!当然有很多大佬会选择鱼与熊掌兼得🤣边忙于实习转正答辩边秋招面试。
秋招的话,是应届生最好的招聘机会,提前批有的公司7月份就已经开始了,8月中旬可能陆陆续续开始正式批,个人觉得如果准备充分,就大胆的投提前批吧,一般提前批都是免笔试直接面试的,况且SP的几率挺大的应该,但是竞争会激烈一些,都是大神,还有要注意有的公司声称提前批与正式批不冲突,但其实往往都会有你的面试表现的,提前批如果表现不好的话,可能就凉凉了🤣,我今年就没敢投,也有部分原因是在实习一天很忙,也没能抽出时间复习。
个人的春招秋招面试感受:面试可以很快的提升自己,每一次面试都要找一下自己的不足,最好手机录音,之后review一下自己答的不好的地方,避免下次面试答不出来,我第一次面试是在大三找寒假日常实习,记得那时面试很紧张,说话有些语无伦次,没有任何面试技巧,后来随着面试场次的增多,自己也变得能“白话”(东北话,就是能说会道的意思吧🤣)了,秋招的时候每次都能和面试官聊的比较好!除了技术面之外还有就是有些公司hr也有决定权,所以提前准备一些hr常问的,不至于现场答不好,被hr PASS掉。下面举例一些我认为比较难答的问题:
- 说三个优点?
- 说三个缺点?
- 你认为你是怎样的人?
- 与其他同学相比,你的优势?
- 你在实习中遇到的最大困难或者挑战?(技术终面也常问)
- 在校园时最困难的时候?
- 遇到过最大的挫折?
- 看过哪些非技术书,能讲讲这本书大概讲了什么吗?等等问题吧
关于准备
下面分享一下楼主秋招前的准备吧(仅供参考哈)!
首先Java开发,我个人主要是先BFS,再DFS,针对不同面试官有不同的收获吧,有的就比较考察知识面的广度,有的就比较喜欢深挖一个点,挖到你不会为止🤐!总之多多准备是没有坏处的哈。
个人主要分为以下几个模块准备的:
项目
有一个好的项目可以对我们面试有很大的帮助,也会提起面试官的兴趣,因为很多问题是随着项目展开问的。并且我觉得最好是有落地项目的支撑,有一个实习经历是很好的,当然如果是大厂实习就更棒了!没有当然也没有关系,现在有很多开源项目,或者教学视频,可以跟着动手做一做,或者自己添加一些可以唠嗑的亮点🤣切记要多问自己为什么,为什么要用这个技术?解决了什么问题?以及用到的技术与其他技术点的对比等等。且要考虑健壮性与特殊情况吧,很多面试官会当场对你的项目给你抛出问题,问你解决方案等。我们也可以适当留出空隙等他问(但是一定要会解决哦🤣)。当然场景题我们能提前准备,且解决方案越多越好被,择优选择,不单单是我们自己的项目,也可以多参考别人的问题(面经啦,同事的难点啦什么的),解决问题多了,自然大部分场景题都不至于没有思路回答不上来了。关于项目就不再多说啦,每个人有每个人的理解,但是网上资源很多的也,如果没有好项目可以自己寻找感兴趣的做一个两个哈。
算法(ACM大神直接划过吧🤣)
由于本人算法比较薄弱,算法实在给不出什么建议,就说说我自己准备了哪些吧,前期是看了牛客推出的 左神大佬的算法视频 讲的通俗易懂(有需要我可以帮忙翻一翻资料😅),之后就是着手每天强制自己刷题做总结,感觉笨笨的我,随着日积月累,还是有所成长的🤣,面试中算法题大部分还是可以秒出来的,本人主要刷了 剑指offer 3-4遍 + leetcode 前450道 2-3遍左右的样子,主要是太笨了😅刷了忘,忘了刷,没办法,那我就多做几遍好了。
如果时间不够,我建议还分类去准备一些常见的题目比较好,8大排序算法一定是要会的,然后就是可以针对链表、树分别找出常考的20-30道题目去做去吸收,还有一些DP、贪心、排列组合经典题目,图的话可能code的不多,但是图的算法还是要掌握的,必要时讲出来,拓扑、迪杰斯特拉、普利姆和克鲁斯卡尔啥的。
操作系统、计算机网络、数据结构
个人觉得这三类基础知识无论是前端、后端任何语言还是测开应该都会考的吧
数据结构
数据结构,无非就是数组、链表、栈、队列、树、图这几类,最重要的应该是对他们的使用场景和区别要有所了解。比如树的话,搜索树、平衡搜索树、红黑树、前缀树、B、B+这些。
可以多看面经和博客或者抽时间读一本书比较好,关于数据结构,我有读过《大话数据结构》个人觉得还不错,适合入门。
计算机网络
关于计算机网络,《计算机网络自顶向下》还是比较不错的,还有就是可以针对性看一看面经与牛友分享的文章,其实常问的就是那几个问题而已,例如:
- 说一说七层模型,各层都是干什么的?有哪些协议?
- TCP和UDP区别,各自的组成部分,基于TCP和UDP的应用层协议?各自应用场景?
- TCP三次握手、四次挥手、为什么三次握手?四次挥手?,三次挥手行不行,连接后客户端出现故障怎么办?
- TCP如何保证可靠,拥塞控制过程?
-
TCP粘包、拆包出现原因场景及如何解决?
- CLOSE-WAIT 和 TIME-WAIT ?
- TIME-WAIT连接过多什么原因?解决?
- 浏览器输入URL并回车的过程发生了什么?DNS查询过程?DNS什么时候用TCP,什么时候用UDP?CDN知道吗?
- HTTP1.0、1.1、2.0区别?
- HTTP报文格式?常用字段?强缓存和协商缓存?
- HTTP和HTTPS的区别?HTTPS的建立过程?对称加密和非u对称加密?
- HTTP请求方式?GET和POST区别?
-
常见状态码?301和302区别?502和504区别?
- cookie和session区别?
- 跨域?怎样解决跨域?
- SYN泛洪攻击?XSS脚本攻击?csrf跨站请求伪造?解决方式?
- ARP欺骗?DNS劫持?傻瓜窗口?等等。。。
操作系统
个人觉得OS这块还是比较好准备的,考的主要就是进程线程、虚拟内存这两大块比较多。Linux考的更多的是常用命令,以及给你个问题怎么排查什么的。
先分享两篇大佬写的文章:
进程、线程全家桶
内存管理
面试题举例:
- 进程由什么组成?进程的几种状态?低地址到高地址都存放哪些东西?
- 进程与线程的区别?
- 进程通信方式有哪些,对比优缺点?
- 用户态和内核态?
- 上下文是什么?进程线程上下文切换?
- 进程调度算法?产生死锁必要条件?解决方式?
- 分页和分段,页面置换算法?
- swap分区?fork函数?僵尸进程?孤儿进程?
- CPU缓存?MESI了解吗?等等
- IO模型?多路复用select、poll、epoll?
Java基础
Java基础个人觉得主要看一些源码吧,例如Hashmap(可以1.7和1.8都看一下)、List的实现、ThreadLocal、Iterator、String、Integer、Java8的新特性、NIO相关的等等,且像集合类一般都会继续问线程安全的实现类也需要看,例如CurconrentHashMap、CopyOnWriteArrayList等等。其他基础常问问题网上都有总结,很好找的,且比较全面。我就不多说了哈!
Java多线程
关于多线程,《Java并发编程的艺术》这本书比较不错,话不多说直接举例一些面试题吧:
- Java中线程通信方式
- Java中乐观锁?CAS问题?什么时候用乐观锁?
- volatile关键字?如何防止重排序?底层指令?
- Sychronized 与 ReentrentLock 对比?
- Sychronized底层怎么实现?MarkWord是什么?偏向锁、轻量级锁、重量级锁?自旋参数怎么设置?
- AQS原理?如何实现的公平锁,非公平锁?
- 读写锁?锁降级?变量的高16位低16位分别保存什么信息?
- CountDownLatch、CyclicBarrier、Semaphore?
- 线程池?7大参数?线程池工作过程?自带的线程池为什么不建议用?核心数量应该怎么设置?
- 手写个生产者消费者、阻塞队列、多线程轮流打印ABC?等等吧
JVM
关于JVM部门,建议阅读《深入理解JVM》这本书,首先主要掌握就是JVM的内存划分,各部分存储什么,干什么的,堆的划分、对象分配原则(对象在老年代还是新生代,怎么移动什么的)、垃圾回收算法、如何标记对象(引用计数法的缺点?GCroots法都哪些对象可以当作根)、对象由哪几部分组成、垃圾回收器(就是G1、CMS可以主要看看,再者可以看下ZGC收集器)、双亲委派原则及破坏、类的加载过程(可以从.java生成.class过程说起,JIT编译器)等等。
大多数比较常见的题目,再者就是JVM调优相关,这个怎么说,就是按自己理解和项目的不同来说吧。之前有看过这篇博客,介绍的还比较全:https://blog.csdn.net/wisgood/article/details/52634852
设计模式
这个怎么说,我个人就是看书和看这个https://refactoringguru.cn/design-patterns来学习,看完后用自己的话总结,写个demo理解。另外就是发现各大框架有哪些地方用到过,各类模式的好处(本菜鸡在项目中还没用过🤣)。
框架
框架部分我也就是主要学了Spring、SpringMVC、Mybatis、SpringBoot、Netty和Dubbo吧,SpringCloud只是了解了解。
传智播客、黑马、慕课网、B站都能找到相应的视频,面试的话可能也是主要看一看各个框架的原理和理解吧,例如Spring的IOC,AOP?循环依赖怎么解决的?bean的生命周期?SpringBoot的启动流程?RPC框架都包含哪几部分?
我在面试中框架问的还是不多的,问也都是一些特性原理,常见的一些问题,花点时间准备下应该问题不大。
数据库
数据库方面我只学习了MySQL,也是比较常问的,书的话我个人觉得《高性能MySQL》和《深入了解InnoDB引擎》还不错,举例:
- 引擎的区别?
- 索引(失效?联合索引?索引建立原则?)
- 锁(行锁?表锁?间隙锁?)
- 事务(隔离级别,RR怎么避免不可重复读(MVCC)?又怎么避免幻读(MVCC+间隙锁)?)
- B+树索引和哈希索引、聚集索引和非聚集索引?
- 回表查询和索引覆盖?
- 一条SQL执行过程是怎样的?
- 数据过大怎么优化分页?
- 各个日志,都干什么的?
- SQL过慢怎么排查?Explain的关键字段?
- MySQL中LUR怎么改造的?为啥这么改?等等。
- 主从复制?分库分表依据?
Redis
现在缓存可能也是很常问的了,《Redis的设计与实现》这本书还是很适合读的,通俗易懂,最好深入学习一下例如说下底层命令什么的,常见面试题举例:
- Redis为什么快?
- Redis持久化方式?
- 数据类型?底层数据结构?
- 过期策略和内存淘汰策略?
- Redis 应用场景?
- pipeline批量处理的优点?
- 主从复制原理?cluster了解吗?怎么确定一个key落在哪个节点?一致性哈希了解吗?有什么缺点?怎么解决?
- 缓存雪崩、缓存穿透
- 如何保证缓存与数据库数据一致性?等等。
中间件
关于中间件,我了解的可能首先就是消息队列,我最常使用的就是RabbitMq,但是也要对其他的产品特性与应用场景有所了解,例如Kafka、RocketMq的对比。消息队列常问的问题例如:
- 消息队列应用场景,作用?
- 如何保证消息可靠?
- 如何保证消费者幂等?
- 如何保证消息顺序性?
- MQ积压了很多怎么办?等 。
ZK可以掌握它的应用场景以及ZAB原子广播协议和崩溃协调,
搜索的话可以学习下倒排索引,以及二者的区别和ES写入原理之类的。
负载均衡可以对比ngnix和LVS区别,以及LVS的三种模式,ngnix的话我们经常使用ngnix+keepalive一起使用,避免ngnix的单点故障,当然还要知道一些负载均衡算法。
分布式
分布式相关的知识还是要掌握的,毕竟我们以后的系统都不可能是单点部署的,这就可以看下CAP理论?BASE理论?分布式事务?限流的方案?分布式id生成策略?分布式锁?或者常用的Hystrix组件等。楼主也是简单的学习了一下,面试时还是考的居多的。
大数据类型
这类题可以多看几个,思路大多大同小异,还是比较好准备的,例如:
- 海量数据整数,内存受限找中位数?
- 如何在100亿URL中快速判断某URL是否存在?
- 海量数据找次数TOP100?等等,
智力题
关于智力题,可能就要多看一些了,这题没看过的话一般现场很难想出来,这里推荐一下这位牛客大佬整理的智力题:https://www.nowcoder.com/discuss/526897
分享下大佬们总结的比较好的资料
- <a href="https://cyc2018.github.io/CS-Notes/#/README?id=✏️-算法">Cyc大佬</a>
- <a href="https://github.com/Snailclimb/JavaGuide">JavaGuide大佬</a>
-
<a href="https://www.nowcoder.com/discuss/146537">Java高阶知识总结</a>
后期再补哈!
最后
最后希望大家都能拿到满意的offer,祝大家工作顺利,感谢各位牛友哈!感谢牛客平台!