前言

首先写这篇文章的目的是回馈牛客,非常感谢这个平台为我们广大学子提供一个学习、交流以及求职的机会。本文对我从去年秋招到今年春招的一些经验和情况作总结。所谓知己知彼方能百战不竭,我先对个人情况进行介绍。 

我的学校虽然不是985,211但是计算机专业挺好,评级为B+,在江浙沪口碑还算不错。我本硕均为计算机专业,算是科班出身,虽然不是尖子生,但是水平也还说的过去。我本硕期间均没有实习经历;项目方面参加过军工项目,自己平时也鼓捣一些小项目。去年这个时候对自己的情况评估了一下,感觉竞争力不太强,所以重心放在了基础的复习与强化。下面给出目前战绩(还有一些混在邮件里懒得找了)。 



下面从基础准备、算法、软技能、项目、个人建议以及资料汇总等方面进行详细叙述。

基础准备


这块本来想放面经的,但是我还是觉得放面经没啥意思,拿别人的经验死记硬背虽然可以获得Offer,但是知识并没有过脑子导致回头就忘,这种方法其实有些过于投机,也不希望大家这么干。其实一开始我的确找了很多面经,经过总结和归纳后得到了一个自己的题库,但是也发现这个题库不够完善,所以经过了海量面试后这个题库也得到了不断补充,最终以博客的形式记录了我近一年的Java学习经历。博客地址如下,欢迎交流技术。 


还要声明一下,我这总结的内容,大部分来自GitHub上CS-Note和JavaGuide提炼精华以及无数CSDN博主的总结,向这些大佬们致敬。其他部分是我从一些相关书籍上整理得到。下面给出基础知识大致的分类:
- 数据结构
- 计算机网络
- 操作系统
- Java基础
- Java集合类
- JVM及其调优
- 多线程以及并发
- Java-I/O
- Spring及其Web开发
- 数据库
- 消息队列MQ
- Redis
- Nginx
- 其他中间件
- Linux操作系统及其常见指令

对知识分类总结并逐个击破是我学习的方法。在了解这些分类后,下面就是如何去填补这些知识空白。快速填补方法就是参考`GitHub`上`CS-Note`和`JavaGuide`的总结,建立基本的知识架构,随后通过看书加深并获取他们没有总结的东西。这里推荐一下我认为应该看的书,注意必须看不等于全书都要看,要挑重点章节有侧重点地反复看。以深入理解Java虚拟机为例,第一章看看就行,第二三七八章必须反复看,第四章偏实践建议多操作,第六章只需要仔细了解`Class`文件的基本结构即可,字节码指令可以简单涉猎或不看。第十二十三章做基本了解即可。下面给出一些书单供大家参考: 
- Java多线程核心技术(技术类)
- Java并发编程的艺术(技术类)
- 深入理解Java虚拟机第二版(技术类)
- Redis设计与实现(技术类)
- RocketMQ技术内幕(技术类)
- Java核心技术卷1/2(技术类)
- 高性能MySQL(技术类)
- 数据结构严蔚敏版(基础类)
- 计算机网络、操作系统的王道408系列(基础类)
- `CyC2018`的`CS-Note`与 `JavaGuide`(GayHub上面试相关得总结) 

其实,弄懂Java基础只需要了解一个看似很简单却又不简单的问题,你确定你真的能讲明白下面这段代码么?反正我到现在也没有自信能完全讲清楚这段代码执行的全部细节。等你把上面跟Java相关的知识点和书都看完了,再来自己捋一遍这段代码到底做了什么?
public class Main {

    public static final boolean FLAG = true;
    public static final byte BYTE = 123;
    public static final char X = 'X';
    public static final short SHORT = 12345;
    public static final int INT = 123456789;
    public static final long LONG = 12345678901L;
    public static final float PI = 3.14f;
    public static final double E = 2.71832;
    private int age;
    private String name;

    public Main() {}

    public Main(int age, String name) {
        this.age = age;
        this.name = name;
    }

    protected int add(int input) {
        int output = input+1;
        return output;
    }

    public static boolean compare(int a, int b) {
        return a > b;
    }

    public static void main(String[] args) throws RuntimeException {
        System.out.println("Hello World!");
    }

}

算法

算法注重积累,除非你天赋异禀,否则很难速成,尤其是跨专业的同学。我上大一才有自己的电脑,第一次C语言上机,肯定要`Hello World`嘛,结果在打印`double`的值时,我一直无法正确输出结果,后来班里有个搞ACM的大佬告诉我,我把`%lf`打成了`%1f`,不知道有没有跟我干过一样蠢事儿的人。我们学校ACM还是小有名气的,所以学院挺注重这方面培养的。我们很多人都选修过老刘的ACM入门课,所以对算法也算有点基本了解,不过上老刘的课更好听的集训队的故事。后来,有一些课程也引导学生去看算法导论这种充满力量的书,看了部分章节后实力稍微涨了一丢丢。自己平时也会刷刷题,LeetCode(300+题)和LineCode(100+题)都有账号,周末有周赛也会偶尔比划下,虽然都是签到水平。算法题平时基本靠LeetCode积累,面试前需要精读剑指Offer,而且要做到滚瓜烂熟,懂我意思吧。对于绝大多数面试中涉及的手撕代码,90%不会逃出剑指Offer+LeetCode热题精选。甚至,你可以通过面试官出的题反推其水平。 最近发现牛客上有算法视频课,左神大名也有所耳闻。看了下相关课程内容觉得比较适合正在求职的同学用它来构建解题思路以及查漏补缺(https://www.nowcoder.com/courses/cover/live/350?coupon=AmPd42S)当时买还是全价买的,现在好像可以优惠140元,有需要的同学可以试试,几百块换一个20w-40w的Offer,你懂得。

[Java算法系列](https:/