当前位置 博文首页 > 沉默王二:超级硬核!Java 自学路线总结,已 Get 大厂 Offer,建

    沉默王二:超级硬核!Java 自学路线总结,已 Get 大厂 Offer,建

    作者:[db:作者] 时间:2021-06-22 12:47

    还是要说一句,“大厂”可能有标题党的嫌疑,但我觉得已经属于比较轻微的那种了,CSDN 的小伙伴们应该能接受。有一说一,能进来看的小伙伴都算是赚到了,认认真真看完这篇内容后,我敢保证,一定会大有所获!trust me!

    对于校招来说,面试官也清楚,应聘者的项目经验不可能太多的,所以各位学弟学妹们心里一定要拎得清,该把重心放在哪!大家一定要明白,语言只是工具,对代码的理解才是核心。面试的时候,不管是大厂还是小厂,考察的核心永远都是基础知识,以及解题的思路

    至于社招,重点当然是做了什么项目,遇到了什么问题,自己是怎么解决的,尤其是高并发高性能这块,是加分项。

    下面来分享下我这些年学习 Java 的心得经验吧,希望能给大家一点点帮助。

    01、Java 基础

    前面已经说过了,校招的时候最注重的是基础知识和解题的思路,有没有项目经验其实是可以往后放一放的。面试官首先期望的是,你的基本功是扎实的,学习能力是能跟得上的。

    要想基础扎实,我给大家推荐一份 GitHub 上星标 115k+ 的学习资料,Java 语法、Java 集合框架、Java 并发编程、Java IO 和 Java 虚拟机,这些基本知识点都包括在内了,详细的内容可以通过下面这篇文章了解。

    太赞了,GitHub 上标星 115k+ 的 Java 教程!

    我列一下 Java 基础部分要掌握的知识点。

    书籍的话,我推荐《Java 核心技术卷 1》,过滤掉里面图形化界面的知识点,这部分知识无论校招还是社招,都不会再考了。已经过时,出版社之所以还印这部分内容,除了不专业,最大的目的就是让书贵一点。

    并发编程和 Java 虚拟机是其中的难点,这部分内容怎么学呢,首先,并发编程可以推荐看看阿里的几位大佬重写的Java 多线程并发小册子。然后,就是周志明老师的《深入理解 Java 虚拟机》,是部大部头。

    书里面不一定都是精华,但好书还是值得花时间去认真读一读的。

    不要只是看书,一定要多练习,只有多练多去总结,才能把里面的知识点吸收消化,否则可能只是过了过脑袋,什么都没记得住!

    02、Spring 框架基础

    可以直接上手学习 Spring Boot,但我还是建议大家先看一看老三样,Spring+SpringMVC+MyBatis,SSM 学得好,对 Spring Boot 有着巨大的帮助,毕竟 Spring Boot 不是新的技术,它只是对这些东西做了约定俗称,让开发的效率提高了,本质上的东西还是老三样。

    其中 Spring 是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。它可以装载 Bean(也就是 Java 中的类,包括 Service、Dao 里面的),有了控制反转这个机制,我们就不用在每次使用类的时候先初始化,用 new 关键字声明。另外,Spring 的 AOP、事务管理等等都是我们经常用到的。

    SpringMVC 分离了控制器、模型对象、分派器以及处理程序对象的角色,这种分离让它们更容易进行定制。

    1. 客户端发送请求到 DispacherServlet(分发器)

    2. 由 DispacherServlet 控制器查询 HanderMapping,找到处理请求的 Controller

    3. Controller 调用业务逻辑处理后,返回 ModelAndView

    4. DispacherSerclet 查询视图解析器,找到 ModelAndView 指定的视图

    5. 视图负责将结果显示到客户端

    MyBatis 是一个支持普通 SQL 查询,存储过程和高级映射的优秀持久层框架。

    MyBatis 对 JDBC 做了封装,它让数据库底层操作变的透明。 MyBatis 的操作都是围绕一个叫 sqlSessionFactory 的实例展开的,通过配置文件关联到各实体类的 Mapper 文件,Mapper 文件中配置了每个类对数据库所需进行的 SQL 语句映射。在每次与数据库交互时,通过 sqlSessionFactory 拿到 sqlSession,再执行 SQL 命令。

    在学习 SSM 和 Spring Boot 之前,确认一下上图中的基础知识有没有掌握,如果都掌握了,再开始学习会比较轻松一点。

    Spring Boot 是由 Pivotal 团队提供的一个全新框架,其设计目的是用来简化 Spring 应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。说句人话就是,Spring Boot 不是什么新的框架,它默认配置了很多框架的使用方式,就像 Maven 整合了所有的 Jar 包,Spring Boot 整合了所有的框架。

    使用 Spring Boot有什么好处其实就是简单、快速、方便!在没有 Spring Boot 之前,我们要搭建一个 Web 项目,通常要这么做:

    1)配置 web.xml,加载 Spring 和 SpringMVC

    2)配置数据库链接、配置 Spring 事务

    3)配置日志文件

    4)部署 Tomcat 运行 Web 项目

    有了 Spring Boot 之后呢,再也不用折腾这些了,仅仅只需要非常少的几个配置就可以快速地搭建一套 Web 项目!

    使用 Spring Boot 可以非常方便、快速搭建项目,使我们不用关心框架之间的兼容性,适用版本等各种问题,我们想使用任何东西,仅仅添加一个配置就可以,所以使用 Spring Boot 非常适合构建微服务。

    SSM 可以到 B 站上看江南一点雨的视频教程。

    https://www.bilibili.com/video/BV1NX4y1G7wx

    Spring Boot 的话,可以搜“纯洁的微笑”的博客,阅读量还是挺大的。

    03、Java 进阶

    这时候,可以看看 Java 圣经《Java 编程思想》,或者新书 On Java 8,在 GitHub 上有开源。

    https://github.com/LingCoder/OnJava8

    这是思想层面的书,记得不适合作为入门书来看的,很多大佬不明所以会给初学者推荐这本书的,推荐一个劝退一个,真的。等有了一定的 Java 编程经验之后,再看这本书就会有一种豁然开朗的感觉,真的。

    这本书读完后,记得写个小项目,可以是个简易版的聊天室,总之得有一个,加上前面的 Spring 框架基础,写这样一个系统我觉得还是可以做到的。聊天室会涉及到 Java 并发编程,网络通信。

    做完小项目之后,又该看书沉淀了,比如说《Effective Java》,这本书不算厚,但都是作者在编写 Java 代码时候的最佳实战和经验规则,能帮助我们写出清晰、健壮、高效的代码,里面其实涉及了蛮多的面试考点,比如说:

    • 局部变量的作用域要最小化
    • 自动装箱和自动拆箱
    • 枚举单例的写法
    • 为什么覆盖equals时总要覆盖hashCode
    • 为什么for-each循环优先于传统的for循环

    这些都是我临时想到的,强烈大家把这本书放在手边,没事的时候看一遍,然后背会——真的是背后。

    然后,还有一本阿里出品的《Java 开发手册》,最新版是嵩山版,仍然是最佳实战经验,并且是一线大厂总结出来的开发规约,可想而知它有多重要!

    当然了, 如果第一次没有看懂《深入了解 Java 虚拟机》,没关系,可以在这个阶段再深入的学习一遍。把 Java 的内存模型,各种锁的原理,Java 虚拟机的垃圾回收机制等等掌握透彻,面试的时候是重点要考的内容。

    04、Java Web 进阶

    这时候,要学的,可就不只是 Java 的相关知识了,要跳出这个圈子。

    第一,要学 Linux,基本上所有的服务器都是 Linux 环境,尤其是正式环境,不存在图形化界面操作的,所以每个立志要做工程师的学弟学妹,一定要把 Linux 重视起来,要知道什么是 Shell,什么是 Vim,Linux 的基础命令等等。

    等阿里云或者腾讯云、华为云搞活动的时候,可以买个学生版的服务器,随便折腾下。推荐的书,就是《鸟哥的 Linux 私房菜》,算是一本畅销书了。

    第二,要学操作系统,最好把《深入理解计算机系统》这本书给看一看,这本书看起来有难度,可以多看几遍,第一遍,大致过掉里面的知识点,第二遍精读,第三遍再温习。

    学生时代的时间还是足够的,所以一定不要把所有的时间都花费到打游戏上面。

    第三,要学数据库,推荐《SQL 必知必会》和《MySQL 必知必会》,两本很小的册子,很快就能刷完了。然后再学一下 Redis,这也是面试考试的重点,以及 MongoDB。

    第四,要学计算机网络,也是面试要经常考的内容,比如说经典问题:

    • TCP 为什么三次握手?四次挥手?
    • TCP 为什么要有 TIME_WAIT 状态?
    • TCP 为什么是可靠传输协议,而 UDP 不是?
    • 键入网址到网页显示,期间发生了什么?
    • HTTPS 握手过程是怎样的?

    入门书有《图解 HTTP》、《图解 TCP/IP》、《网络是怎样链接的》,再深入的话推荐《计算机网络:自顶向下》。

    第五,要学数据结构与算法,这块我也强调过多次了,基本上面试的重点吧,无论什么时候,程序=数据结构+算法这种说法都是成立的。Java 中的线性数据结构有数组、链表、栈、队列,非线性数据结构有树、哈希表、图等等。常见的排序算法有:选择排序、冒泡排序、插入排序、快速排序、归并排序、希尔排序、基数排序、计数排序、桶排序、堆排序等等。常见的查找算法有:顺序查找、二分查找、插值查找、斐波那契查找、树表查找等等。常见的算法有:KMP算法、贪心算法、回溯算法、动态规划、递归算法等等。

    这里给大家推荐一份纯 Java 版的 LeetCode 刷题笔记吧。作者曾给我说,刷完 100 道题之后,发现真的是爱上了刷题。基本上后面的每道题都可以想出一种思路,甚至就是最优解,还会萌生一些别人没想到过的解法——基本上只要算法学得好,大厂小厂的 offer 基本上就 70% 的把握了!

    刷完 300 道 LeetCode 题后,我膨胀到要飘起来了

    05、加分项

    • 多少学一点前端知识吧,并不是非要做全栈开发工程师,可以在做练手项目的时候能顺手一点,毕竟练手的时候和公司上班不一样,后端只干后端的活,一个人还是要能搞定一个练手项目的,JavaWeb 又离不开前端,基本的 JavaScript、CSS 和 HTML,还是尽量掌握一些。
    • 熟练使用各种工具,比如说 Intellij IDEA,能提高编写代码的效率,比如说 Git,能提高“局域网协作开发”的效率,比如说抓包工具,用来测试,比如说反编译工具,用来深入查看Java 字节码,等等。
    • 对一些新技术有敏感度,比如说服务器治理框架 Dubbo,比如说网络编程 netty,比如说消息通信 rabbitmq,比如说服务器 Nginx,比如说虚拟机化 docker 等等,这些知识都有掌握。

    希望大家都能找到一份称心如意的 offer!据说点赞的运气都不差。

    最后,二哥在线求个三连,点赞、收藏,或者热心的留个言,鼓励一下好不好?