---
url: /doc/Java面试指北/ee7x23b8/index.md
---
# 从考研失败到收获到自己满意的 Offer

### 关于我

我现在是本科大三学生，在电子科大就读软件工程专业，在我大一大二的时候其实也并没有找到所谓的方向，将来想要从事什么岗位。只是一心想着先学好学校的专业课程，工作就业的事以后再说。我就一直用自己在学校课程上取得的一点点成绩在麻痹自己，逃避就业的现实。其实大家也都非常清楚，现在高校里面讲授的内容很多都是偏向于底层的一些理论知识，并不会具体教你框架、怎么做项目、怎么样写代码、即使有很多实验课程也都是非常地老套和实际情况差距非常大。这就直接导致一个很大的问题：我的编程能力很差，没有一点自信。

由于我们学院特殊的安排，我们基本所有必修专业课程的学习都在大一和大二修完，大三上半学期有少量的专业选修课程和思政课。大三下整个学期都是要去企业完成 6 个月的实习。了解到很多优秀的学长在大三实习的时候就拿到了非常厉害的 offer 和优厚实习待遇，我当然是非常的心动，希望能够在大三下学期的时候能拿到一个不错的实习岗位。由于我个人是非常不愿意去做测试开发，算法开发的门槛又相对较高，然后就选择了 Java 这个方向。

### 准备面试

我其实在大二上半学期的时候修了 Java 这门课程，但是学校的 Java 课程是非常老套，和实际企业里的开发是完全脱节。在大三上半学期我当时就在网上找各种 Java 的学习路线，但我发现有很多学习路线看完都是“实力劝退”的感觉，因为内容太多太杂，对于一个想要入门开发的 Javaer 非常不友好。也是机缘巧合，在一个学长（很厉害的一个学长，目前在华科直博）推荐下，了解到 JavaGuide 这个开源项目，从那时起我才算是打开了新世界的大门。学习路线非常清楚，特别对于我们这种初学者的人来说非常友好，知识点的总结也在我后来面试过程帮了大忙。

看到身边的大佬们手拿多个大厂实习 offer 不知道怎么选时，一方面是非常羡慕，另一方面就是觉得自己是在还以前欠下的债，所以大三上整个学期我的压力都是挺大的，边学习 Java 的技术栈边准备面试。前前后后面试的公司有百度、成都 SAP、京东（京东数科）、新浪微博等，最终也算是如愿以偿，马上准备入职京东。

至于我怎么准备的面试？我觉得很重要的一点就是根据自己写的简历和所投递岗位的 JD 有针对性地复习。在简历上最为重要的版块就是项目经历和技能清单这两块，这两部分直接决定了能不能拿到面试资格和面试官怎样提问。所以我当时就遇到了一种窘境，因为我是边学 Java 边面试，项目这部分可写的非常少，基本就没有。

我看过各大公司的招聘需求：Java 开发现在基本都是 SSM、SpringBoot 框架等等，当我学完了这部分之后，我就跟着学校老师那边做了一个 Java 后端的项目把学的框架练习了一遍，写在了简历上，**之后我就对项目中的技术点进行复盘**。

在当时我确实有着投机的心态，但是必须要有这样一个项目，否则我可能连面试的机会都没有，在参加了多次面试之后我的感受就是：作为实习生，**项目这一方面重点在于面试官他要确认你是实实在在地做了，并且有你自己的思考和收获。面试的重点其实是在很多基础的问题上**（面试题放在后面），在基础这部分，我反复地复习 JavaGuide 上面的基础知识点，在这里必须感谢 JavaGuide，这可以说直接影响了我在面试中的表现。

### 面试真题

> 下面的面试题是来自百度、京东、新浪微博，我进行了一个总结，希望能帮到大家，划重点的部分表示反复被问到

#### 数据结构与算法篇

* B 树和 B+树的区别
* **你了解哪些排序算法？算法的思想、时间复杂度、空间复杂度？**
* LeetCode 第 1 题及第 15 题：两数之和及三数之和问题

#### 计算机网络篇

* **TCP 三次握手、四次挥手流程？为什么三次，为什么四次？**
* **TCP 和 UDP 区别，有 TCP 为什么还要有 UDP？**
* TCP 粘包和拆包问题有了解吗？
* TCP 是怎样保持连接的？

#### 操作系统篇

* **并发编程中死锁有了解吗？死锁产生的条件是什么？你在项目中是怎样解除避免和解除死锁的？**
* 进程的都有哪些状态？怎么转换的？
* Linux 下文件的操作命令

#### 数据库篇

* **数据库范式了解吗？在你的项目中怎么运用的？会出现什么问题？**
* **数据库索引了解吗？MySQL 中索引底层是怎么实现的？**
* MySQL 中存储引擎 InnoDB 和 MyISAM 有什么区别？分别用于什么场景？
* **数据库事务有了解吗？事务的隔离级别？你在项目中使用的隔离级别是什么？**
* SQL 优化有什么思路？
* 项目中使用到外键了吗？外键作用？使用外键要注意些什么问题？
* 除了 MySQL 数据库你还用到哪些数据库？Redis 数据库和 MySQL 数据库的区别？
* 设计一个数据库表

#### Java 基础篇

* 类和对象的区别？
* 讲讲 static 关键字和 final 关键字
* **synchronized 关键字是怎么用的？底层实现有了解吗？还有用过其他的锁吗？**
* **BIO、NIO、AIO 区别有哪些？项目中有用到吗？Netty 了解吗？**
* 接口和抽象类的区别？什么时候用接口，什么时候用抽象类？接口可以继承接口吗？
* **HashMap 和 HashTable 的区别是什么？**
* *ConcurrentHashMap*和*HashMap*的区别是什么？*ConcurrentHashMap*为什么线程安全？
* **HashMap 和 HashSet 的区别？HashSet 是如何检查重复的？**
* Java 中线程的状态？join()、yield()方法是干什么？
* Object 类下有哪些方法？
* 字符串"*123*"转换成整型*123*的*API*是什么？整型*123*转换成字符串“*123*”的 API 又是什么？
* **创建线程有几种方式？分别是怎么做的？**
* 线程池用过吗？如何创建一个线程池？其中各个参数的含义是什么？为什么要用线程池？coreSize？
* **synchronized、ReentrantLock 区别？**
* CountDownLatch 和 Semaphore 用过吗？他们的区别是什么？CountDownLatch 应用场景？比如现在要让第 5 个线程等待前 4 个线程执行完毕再执行，具体怎么做？
* 使用 synchronized 来实现单缓冲区的生产者消费者模型？
* JVM 有了解吗？JVM 中参数`–Xms`和`-Xmx`是什么意思？
* **设计模式有了解过哪些？单例设计模式知道哪几种写法？策略设计模式了解吗？你在项目中用到了哪些设计模式？**
* Spring 中依赖注入有几种方式？怎么做的？
* Spring 框架中有哪些组件了解吗？分别做什么的？
* **SpringMVC 的这种 MVC 模式了解吗？他的工作原理是什么？用到了哪些设计模式？（基本每轮面试都被问到）**
* SpringMVC 中要接受用户传来的参数要怎么做？REST 的风格呢？
* Spring 中 bean 的创建过程了解吗？
* SpringBoot 和 SpringMVC 的区别和联系是什么？了解 SpringBoot 的启动流程吗？SpringBoot 自动配置是如何实现的？

总结：其实我们看上面的问题，整体来说还是非常地基础，**尤其对于实习生和应届生来说，基础是第一位的，就包括百度和京东的面试官都在面试最后给我强调基础的重要性**

### 写在最后

以前觉得自己还小还早，告诉自己才大一大二，可是当突然把自己推向生活的洪流，我仿佛什么都做不了。有了这段找实习的经历，我觉得自己成长了不少，要勇敢地跳出自己的舒适圈，当自己不知道做什么的时候就去面试，让社会对你进行评价。

在这个过程中，我也眼看着很多好的机会从我身边流走，都是因为自己还不够优秀，虽然现在有幸拿到了实习机会，但我也时刻告诫自己要保持学习，沉淀自己，当有更好的机会来临时我能够抓的住。

**在 Java 开发这条路上，我也算是刚刚入门，要学的还很多，作为 JavaGuide 的忠实粉丝，再次感谢 JavaGuide！** （Guide 哥故意加粗了一下，开心 😄）

*Guide 哥注：生活要继续，学习也要继续。对我而言，JavaGuide 还有太多太多不足的地方，后面的日子会继续完善下去。*

> 更新: 2022-05-29 15:24:22\
> 原文: <https://www.yuque.com/snailclimb/mf2z3k/cb7bwf>
