《Java 面试指北》来啦!这是一份教你如何更高效地准备面试的小册,涵盖常见八股文(系统设计、常见框架、分布式、高并发 ......)、优质面经等内容。
你好,我是 Guide。
今天来分享一位知识星球内部小伙伴的投稿,记录了自己从考研失败被迫找工作,到顺利找到自己满意的工作的经历!走心了,看完之后很受触动!
下面是正文。
我来自一个没什么名气的双非一本,自己的专业是计算机科学与技术。在大二的时候,由于家里的一些影响和我自己对于未来的迷茫,正如你们所见,我走向了考研这条路。
去年,因为参加考研错过了秋招,走出考场的那一刻,我便知道自己在研究生这条路上已经没办法再继续走下去了。我认认真真的准备了将近一年半的时间,最后由于某校复试线涨幅 45 分导致遗憾败北,我很失落,我很难过,但同时我也知道这样的自甘堕落并不能让我获得一个美好的未来,并不能让我实现自己早已经规划好的未来计划。于是我转头就加入了数以百万计的春招大军,当时的我还不知道前方到底有什么在等着我。
因为自己的大学专业与 Java 相关的课程仅仅只有两门,并且由于当时的不重视也导致自己对于 Java 这门语言的了解仅仅停留在面向对象相关知识以前,只会一些简单的条件判断、循环控制等。
在前期的准备时,通过各大招聘网站和向相关前辈的咨询,我渐渐明白了在这之后还有封装、继承、多态,以及企业开发用到的框架、分布式、微服务等知识。看着用鼠标甚至一下滑不到底的学习路线图,我有些恐惧,但是时间没有给我继续患得患失的机会,咬咬牙,来吧!
备战面试
下面是我从开始学习直到现在的大致时间表。
- 一月中上旬开始根据马士兵的 Java SE 视频进行学习,我知道相比于后面的一些知识,这里的基础是十分重要的,因此我在每天听完几个小节,完成作业之后会在晚上重新进行知识点的复盘,将自己这一天所学到的知识以博客的形式记录下来,并且在第二天抽碎片时间进行前一天的知识复盘。这样的日子大概持续到了二月中旬。
- 二月中旬到二月底是我进行前端(HTML CSS JavaScript Vue ElementUI 套件)学习的时间段,这里我仅仅是掌握了一些比较基础的语法知识,写了几个 Demo 和两个大作业就结束了这方面的学习,因为只是为了给自己后面的项目做铺垫。同时因为这部分入门比较轻松,自己也会经常复盘 SE 的相关知识。
- 三月初开始我已经陆陆续续开始关注牛客网、Boss 直聘、携程上面的消息。并一边进行 Java EE 知识的学习一遍迭代自己的项目。从最基本的 SSM 迭代到后来的 SpringBoot,在这段时间我明显的感知到经常动手去实现自己的想法,才是这个阶段学习的最好方法。
- 大概到三月二十号,我就基本完成了自己的项目功能,虽然说还有部分功能仅仅停留于设想之中,但是因为是重复的工作,考虑到时间的问题就没有再继续完善。从这个时间段一直到五月中旬,都是在不停的笔试面试,准备八股项目经历中(这里感谢 G 哥和他的网站 JavaGuide 以及星球内部的 《Java 面试指北》 ,可以说是我全程准备八股的明灯!!!)。最终功夫不负有心人,在五月中旬,我选择了自己最满意的 offer,上岸了。
我的面经
以下是字节飞书,哈啰,谷歌中国,美团面试和其他中小厂被问到的知识点,列出这些技术点以供大家参考。
Java 基础篇
- JDK & JVM & JRE 的区别
- 包装类型的常量池技术
- 接口和抽象类的区别
- String、StringBuffer、StringBuilder 的区别
- 泛型擦除的原理
- 反射的应用场景
- 异常的类型,具体的例子有哪些
- 说说常用的容器和各自的特点
- ArrayList 的扩容机制
- HashMap 源码实现
- ConcurrentHashMap 的底层实现
- Lambda 表达式有什么好处,什么坏处,应用场景有哪些
Java 并发篇
- 为什么要使用多线程,有什么好处,举例具体场景
- 线程的生命周期以及每个周期进入和结束的标志
- 避免死锁的三个必要条件
- 简述哲学家进餐问题和银行家算法
- 为什么我们调用 start() 方法时会执行 run() 方法,为什么我们不能直接调用 run() 方法?
- 场景题:如何实现一个实时排序的游戏战力榜单
- 场景题:如何实现一个竞技场挑战功能,考虑高并发
- volatile 的用法
- synchronized 和 ReentrantLock 的区别
- 乐观锁和悲观锁的底层实现
- 不加锁如何保证线程安全
- synchronized 是可重入锁么
- 使用了 vector 就一定能保证线程安全吗
- 多线程的实现方式
- 场景题:高并发的情况下保证数据的一致性怎么做到
- 场景题:有 10 个线程分别对 i = 0 做 10 次自增操作,最后 i 的值会是多少,为什么
- ThreadLocal 的原理
- 场景题:在生产者消费者问题中怎么保证当消费者用完产品后生产者会马上得知,不能使用 while 循环去解决
- Java 的线程池类型有哪些
- Java 线程池的参数以及其具体意义
- 线程池的拒绝策略
JVM 篇
- JVM 的基本结构
- 双亲委派模型的好处
- 运行时数据区的基本结构,各种结构都有什么用途
- 垃圾回收策略
- 垃圾回收器都有哪些
- 如何判断一个类是无用的类
- 查看运行内存,JVM 状态有什么方法
- G1 回收器与之前的回收器相比最大的不同是什么
- 类加载的过程是什么,每个过程具体做到了什么事
- JVM 的常用参数有哪些
- JVM 调优常用的手段是什么
Spring 篇
- Spring 的特性和优势是什么
- Spring 有哪些组件
- 场景题:如果实现一个你自己的 Spring 框架需要考录那些方面,简单聊聊
- Spring MVC 底层实现原理
- IOC 和 AOP 具体介绍一下
- Spring Bean 是什么
- IOC 和 DI 是什么关系
- IOC 配置的三种方式
- 依赖注入的三种方式
- 为什么推荐构造器注入方式?
- 场景题:在使用构造器注入方式时注入了太多的类导致 Bad Smell 怎么办
- AspectJ 注解方式接触过吗,具体说说有什么特点和不足
- Spring 为何不能解决非单例属性之外的循环依赖?
- Spring 中 Bean 的生命周期介绍一下
- 场景题:自定义一个你自己的 starter 怎么实现(开共享屏幕实现)
MyBatis 篇
- 接口层和数据库交互的方式有哪些
- 简述 MyBatis 的层次结构
- sqlSessionFactory 与 SqlSession 介绍一下
- Excutor 的概念
- 动态 SQL 有哪些,都有什么用途
- 为什么要使用连接池
- $ 和 # 的区别
计算机网络篇
- OSI 和 TCP/IP 介绍一下
- HTTP 和 HTTPS 的区别
- HTTPS 的加密手段是什么
- 三次握手的过程以及每一次起到了什么作用
- 四次挥手的过程以及每一次起到了什么作用
- TCP 协议中的流量控制起到什么作用
- 介绍一下 ARQ 协议
- 从输入 URL 到页面加载发生了什么
- HTTP 如何保存用户状态
- Cookie 的作用是什么
- Cookie 和 Session 有什么区别
- HTTP 状态码有哪些
数据库篇
- 数据库设计通常分为哪几步
- MySQL 的分页怎么做的
- MyISAM 和 InnoDB 的区别
- MySQL 日志都有什么,分别有什么作用
- 读锁和写锁实现的底层原理
- 表级锁和行级锁的实现原理
- 事务的特性
- 并发事务带来的问题有哪些
- 事务隔离级别有哪些
- 场景题:MySQL 对于千万级的数据库或者大表怎么处理
- MVCC 解决什么问题
- 索引有什么作用
- 索引的底层数据结构
- 为什么 InnoDB 使用 B 树作为索引的数据结构
- 索引有哪些种类
- 为什么会出现回表查询,怎么避免
- 解释一下最左前缀法则
- 覆盖索引是什么意思
- MySQL 读写分离方案
- MySQL 主从复制是什么意思
- MySQL 主从的延迟怎么解决
Redis 篇
- 为什么 Redis 是单线程的
- Redis 一般有哪些使用场景
- Redis 有哪些数据类型,每一种都有什么实际应用
- sds 存在的意义
- 为什么会设计 Redis Stream
- Redis Stream 消费者崩溃带来的会不会消息丢失问题
- Redis Steam 坏消息问题,死信问题
- Redis 的持久化机制是什么
- AOF 是写前日志还是写后日志
- Redis 过期键的删除策略有哪些
- Redis 内存淘汰算法有哪些
- Redis 如何做内存优化
- Redis 事务相关命令
- Redis 事务中出现错误的处理
- 为什么 Redis 不支持回滚
- Redis 缓存有哪些问题,如何解决
- Redis6.0 之前为什么一致不用多线程
写在最后
在我们的小群里面,我从一开始的默默无闻,直到现在大家亲切的叫我“念神”。
不得不承认从这一次找工作的经历中让我成长了许多,从不断地学习复习中我明白了扎扎实实学习和不断复盘的重要性、从每天背不完的八股文和熬夜刷视频中我明白了胜利成果的来之不易;从最多的时候每天 3-5 场面试中我明白了实践是检验学习成果的唯一方式;从自己手中不断接到的 offer 和等待心仪的 offer 的焦虑中我明白了原来胜利果实的滋味是这么的甘甜。
再次感谢 G 哥与 JavaGuide 以及星球内部的 《Java 面试指北》 ,还有群里的小伙伴们。感谢能够给我 offer 的公司的认可,也在这里表达我对拒绝一些 offer 的歉意。
我们都是非常平凡的人,为了生活,为了理想,为了家庭,为了未来。只有自己的目标清晰,并付出不断的努力,才能勉强达到一个普普通通的水平。在大环境普遍唱衰的互联网当下,“卷”已经不再是前几年大家口中的玩笑话,也不再是什么包含着浓浓贬义的词汇,而是已经演变成了一种风气,当我们无法改变世界,能做到的只有改变我们自己。
总有一天我们会扛起家里的大旗,成为父母的依靠,希望包括我在内的大家,不要在那个时候后悔当初为什么没有拼尽全力,希望到了那个时候,我们可以淡淡的从容面对。
最后,在 Java 开发这条路上的旅程对我而言才刚刚开始,所谓师傅领进门,修行在个人。希望看到我,认识我的人能够多多包涵这个刚二十出头的小伙子,毕竟他还有许多的路要走,许多的亏要吃。
一路走来有你们,真好!
·········· END ··············
近期文章精选 :