凌晨起来肝的一篇 Java 学习路线,保证学弟学妹们大三大四的时候顺利找到实习 Offer

Source

大家好,我是二哥呀!

13 年 Java 编程经验的老油条了,拒绝过阿里,在日企搬砖过 5 年,Java 领域的优质创作者,说实话,如果是单纯奔着实习 Offer 去的话,还是不难的

说句挺不好意思的话,上学和刚参加工作那会,我一直傻乎乎的认为,只要把 Java 吃透的话就可以了,直到近些年我才恍然大悟,我的认知是有缺陷的。想从事 Java 后端开发工作,需要从以下 5 个方面做起,找到实习 Offer 绝壁不是问题。

  • C 程序设计语言,为什么学 Java 要学 C 语言呢?这也是我最近才想明白的一个问题,因为 C语言是其他编程语言的母胎,包括 Java,不少同学感觉自己学 Java 很吃力,原因可能就在这,没有把根基打好。
  • 数据结构与算法,清华大学的邓俊辉教授曾说过这样一句话,数据结构作为构建高效算法的必要基础,在计算机科学领域中,起到了技术体系基石的作用。而算法呢?又是面试的必考内容,在国外,甚至可以只刷算法题就能拿到大厂的 Offer,这里给大家推荐一份纯 Java 版的 LeetCode 刷题笔记,美团技术大佬写的,主力编程语言是 Java 的同学可以借鉴下,刷题的幸福指数会提高很多刷完 300 道 LeetCode 题后,我膨胀到要飘起来了!纯正 Java 版
  • 计算机组成原理,这方面知识比较扎实的话,学妹再找你装机修电脑的话,可以说轻松搞定。计算机是由 CPU、内存、显示器这些设备组成的硬件,但我们大学毕业后,往往从事的是软件方面的开发工作。那怎样才能在硬件和软件之间自由穿梭呢?答案就是学好计算机组成原理。弄明白了计算机的组成原理,也就对整个软件开发有了一个系统的认知,不论是计算机的硬件原理,还是软件架构,都能很好的驾驭,随之而来的,我们的职业发展机会也就更多了。
  • 计算机操作系统,为什么要学习计算机操作系统?第一,面试要考,第二,无论学习哪门子编程语言,比如说 Java、C/C++,都需要和操作系统打交道,像 Java 中的多线程技术,其实是由操作系统来负责进程和线程管理的;第三,学习操作系统,还能学到内存分配方面的知识。
  • 计算机网络,又是一块面试经常被问到的知识点,什么 TCP 为什么三次握手?四次挥手?TCP 为什么是可靠传输协议,而 UDP 不是?键入网址到网页显示,期间发生了什么?HTTPS 握手过程是怎样的?
  • Java 源码,我大学时期有一个很牛逼的同学,基本上我们遇到的问题在他那都能搞得定,我问他有什么秘诀吗?他的答案很简答,看 Java 源码啊!确实,面试的时候,像 HashMap 这种源码级别的知识点,基本上是必问项目。

我之前整理过一个 Java 工程师进阶之路的大纲思维导图,这里贴出来大家围观下(参考自 hollis 的成神之路)。


当然了,这只是 Java 后端体系的鸟瞰图,校招的时候,不会要求上面的这些知识点全部都得掌握,像设计模式这块,通常需要大量的实战经验才能运用得恰到好处,学生阶段,往往项目经验比较缺乏,所以这部分内容在大学的时候往往没办法施展拳脚。

我之前曾分享过这么一个观点,假如有那么残酷的一天,我不小心喝错了一瓶药,一下子抹掉了我这十多年的编程经验,把我变成了一只小白。我想自学 Java,并且想要找到一份工作,我预计需要 6 个月的时间,前提条件是每天都处于高效率的学习状态当中,并且每天的学习时间至少在 12 个小时以上。

现在回头再评估下,发现这个观点依然是成立的。

如果大学阶段,学校开设了数据结构与算法、计算机操作系统、计算机网络、C语言程序设计这些基础课程的话,其实学起来会更快一点。

对于那些转专业的同学来说,如果时间比较紧迫的话,可以直接上手 Java,等到拿到了实习 Offer 后再把这些基础补一补我认为也是可以的。但这种情况下,就必须在找工作前很刷面试题和算法题了,通过强化突击弥补自己在计算机基础知识方面的短板。

我认识这样一些同学,是真事,初中高中阶段就对编程很感兴趣,在兴趣的驱使下很早的就有了编程的基础。我之前就认识这么一位小妹妹,初中的时候学习成绩特别好,直接保送到北航的一所直属高中,不是搞卫星就是搞航天模型,立志以后做一名黑客。


对于这些未来潜在的技术大佬,她们学什么都会特别快,因为论语里不是有一句话嘛,“知之者不如好之者,好之者不如乐之者”!

一、Java 基础

关于 Java 基础篇的学习,我这有一份 GitHub 上标星 115k 的 Java 教程:包括 Java 核心、Java 集合框架、Java 并发编程、 Java IO,非常全面,是我花了一周多时间手工整理的,非常辛苦,大家一定要珍惜

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

你也可以选择看书,我推荐《Java 核心技术卷》,分为上下两册,上册的难度较低,可以在短时间内刷完。下册涉及到的内容有流与文件(☆)、XML、网络(☆)、数据库编程、国际化、Swing、AWT、JavaBean、安全(☆)、脚本编译和注解处理、分布式对象、本地方法(☆),没有标星的内容我认为可以略过。

然后再看一看《Java 编程思想》,看自己是否能驾驭得了。因为思想的东西嘛,只有经过一些实践后才能有所感悟,否则就像王阳明一开始对着竹子格物一样,屁也格不出来,有了后面领军作战的经验,以及到地方上体验艰苦生活的感受后就开创了心学。

视频的话,可以看一下浙江大学教授翁恺老师的。在浙大,每年最受关注的内容之一就是永平奖的百万大奖会花落谁家。2018 年,获得永平杰出教学贡献奖的人,就是翁恺教授。

https://www.bilibili.com/video/BV1DJ411B7cG?p=3

翁恺教授可以说是浙大的网红教授,非常受欢迎,网络上各种风评都很不错。

我来列一下 Java 基础部分要掌握的知识点吧,可以按照这个顺序来学习,每学完一部分就打卡下。

初学阶段,强烈建议大家把书本上、视频上的代码都敲一遍。由于不像工作后,有大量的项目可以实践,所以不能得到及时的反馈,记笔记就显得特别的重要。另外,一定要分门别类保存好自己的 demo,以便以后可以快速得找得到,尤其是一些小套路,会很有用,积累得多了,可能就变成了自己的工具库。如果还有精力的话,可以把自己的学习心得分享出来,发表到博客上。

我之前就记了蛮多笔记的。像下面这些基础到不能再基础的知识点,我都有重新去学,并且尝试用自己的方式把这些知识点表达清楚。就这样不断的分享,不断的积累,我好像才真有点清醒的感觉。

什么是面向对象编程(OOP)?

为什么要将局部变量的作用域最小化?

Java到底是值传递还是引用传递?

如何比较 Java 的字符串?

再谈 Java 的继承和超类 Object

Java Serializable:明明就一个空的接口嘛

Java Socket:飞鸽传书的网络套接字

Java 网络编程:必知必会的 URL 和 URLConnection

Java面试官:兄弟,你确定double精度比float低吗?

请用面向对象的思想,谈一谈这次面试的过程

Java:接口和抽象类,傻傻分不清楚?

Java生成二维码分享海报

Java:优雅地处理异常真是一门学问啊!

教妹学 Java:晦涩难懂的泛型

教妹学Java:大有可为的集合

教妹学 Java:难以驾驭的多线程

Java 的核心目的和并发编程

Java:程序不过是几行代码的集合

如何理解 Java 中的继承?

吃人的那些 Java 名词:对象、引用、堆、栈

Java 的操作符——“=”号

害死人的自动递增,不偿命的自动递减

Java 流程控制语句

Java是通过什么机制来确保对象初始化呢?

Java 访问权限控制:public、private、protected

Java代码复用的三种常用方式:继承、组合和代理

Java:多态乃幸福本源

Java String,看这篇就够了

Java 数组,看这一篇就够了

HashMap,难的不在Map,而在Hash

Java枚举:小小enum,优雅而干净

Java注解(Annotation):请不要小看我!

Java I/O 入门篇

Java:并发不易,先学会用

我给学弟学妹们提供这样一个思路。

首先,我们需要一个思维导图(我一开始贴出来的那副),顺藤摸瓜,看看都有哪些知识点需要学习。

然后,我们不断地细分,切入这些零散的知识点,从书中、视频中、博客中找答案,吸收。

再然后,我们尝试按照自己的思考方式去分享这些知识点,不怕丢人,勇敢地做分享,力求让自己教会别人。

最后,和他人进行沟通,再通过实践去检验自己的学习成果。

这一套下来,不能说编程上有了突飞猛进,至少可以能突破瓶颈。

二、Java 框架

这部分也可以叫做 JavaWeb,但我更倾向于把这部分叫做 Java 框架,因为 JavaWeb 最初要学习的东西是 JSP,Servlet 这些东西,都已经被淘汰了,再去学这些知识只会浪费时间。有了大佬推荐了这部分内容,说 Spring 的那些系列框架也只是围绕这些知识点展开的,有一定的道理,但还是不太建议把时间花到这部分知识点上,要知道,技术是要更新换代的,好钢用在刀刃上。

做 Web 开发,是会涉及到前端的一些知识点的,尤其是在练手阶段,不会像进公司后一个萝卜一个坑,只负责后端或者只负责前端,往往需要全栈,但想从事 Java 后端开发的话,前端这些知识点还是尽量少花时间,尽量在练手阶段找同学合伙做项目,不要把自己搞成一个全栈,前端也是很累的一个活,需要时间的。

前端技术蛮多的,我举几个常见的,比如说:

  • Vue,前端框架
  • Vue-router,路由框架
  • Vuex,全局状态管理框架
  • Ant Design Vue,前端 UI 框架
  • Axios,前端 HTTP 框架

这还不包括 JavaScript+HTML+CSS 在内。

所以,学弟学妹们明白我的意思吗?如果一心想从事 Java 后端开发,尽量找喜欢前端的同学配合一起做练手项目,不仅能锻炼团队配合的默契,还能让自己有充分的时间学习更深度的 Java 后端技术。

从事 Java 后端开发的话,自然也就离不开 Spring 的系列框架。Spring 框架早已成为 Java 后端开发事实上的行业标准,如何用好 Spring ,也就成为 Java 程序员的必修课之一。同时,Spring Boot 和 Spring Cloud 的出现,可以帮助 Java 程序员更好地基于 Spring 框架及各种基础设施来快速搭建系统,可以说,它们的诞生又一次解放了Java 程序员的生产力。

所以,Spring Boot 和 Spring Cloud 已成为 Spring 生态中不可或缺的一环。想成为一名合格的 Java 后端工程师,Spring Framework、Spring Boot、Spring Cloud 这三者必须牢牢掌握。

首先来学 SSM(Spring+SpringMVC+MyBatis,企业级应用的必须品)的整合教程,哪怕是已经有了 Spring Boot,SSM 仍然是必学的,能打下更坚实的基础。

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

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

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

怎么学习这部分内容呢?我不太建议看书,因为这方面的书籍在豆瓣上的评分都不怎么高。

SSM 实战 100 集:https://www.bilibili.com/video/BV1NX4y1G7wx
Spring5框架最新版教程:https://www.bilibili.com/video/BV1Vf4y127N5
2021 最新版 SpringMVC 视频教程:https://www.bilibili.com/video/BV1qp4y1n7D1
2021 最新版 MyBatis 视频教程:https://www.bilibili.com/video/BV1c54y1a7GE

然后是 Spring Boot。Spring Boot 是由 Pivotal 团队提供的一个全新框架,其设计目的是用来简化 Spring 应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。说句人话就是,Spring Boot 不是什么新的框架,它默认配置了很多框架的使用方式,就像 Maven 整合了所有的 Jar 包,Spring Boot 整合了所有的框架。使用 Spring Boot有什么好处其实就是简单、快速、方便!我推荐看纯洁的微笑的博客,访问量在千万级别以上,影响了无数的初学者,我个人强烈推荐。

spring-boot - 纯洁的微笑博客

如果说已经掌握了 Spring、SpringMVC、MyBatis、Spring Boot 等内容,就有能力进行一些真正有用的应用项目开发了,可以拿下面这些项目作为练手,都是 GitHub 上一些星标超级多的优质项目,对增加项目经验有很大帮助。

1)电商秒杀

SpringBoot 完整电商系统 Mall:包括前台商城系统及后台管理系统,基于 SpringBoot+MyBatis 实现。

一套微服务商城系统 mall-swarm:采用了 Spring Cloud Greenwich、Spring Boot 2、MyBatis、Docker、Elasticsearch 等核心技术,同时提供了基于 Vue 的管理后台。

miaosha:秒杀系统设计与实现。

2)博客论坛

vhr:微人事是一个前后端分离的人力资源管理系统,项目采用 SpringBoot+Vue 开发。

halo([ˈheɪloʊ],意为光环,也可以当成拼音读(哈喽)):一个优秀的开源博客发布应用。

对于在校生来说,缺的就是实战经验,我推荐的这些练手项目可以很好的弥补这块短板,挑一个拿出来练就足够了哈,不需要全部都练。

三、Java 虚拟机和 Java 源码

先说 Java 虚拟机。

Java 虚拟机(JVM)是相对难吃透的一个环节,但却十分的重要,JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需要生成在 Java 虚拟机上能运行的目标代码,也就是字节码,就可以实现跨平台的诉求了。JVM 学得通透的话,可以说是非常牛逼的程序员了。

给大家推荐一个 B 站上的视频,分为《内存与垃圾回收篇》《字节码与类的加载篇》《性能监控与调优篇》三个篇章。

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

然后再推荐一本书《深入理解 Java 虚拟机》,周志明老师的。第三版在豆瓣上的评分直接来到了 9.5 分,可以说是强得一笔!这是一部从工作原理和工程实践两个维度深入剖析 JVM 的著作,是计算机领域公认的经典。

  • 第一部分(第1章),主要讲 Java 虚拟机的历史
  • 第二部分(第2~5章),详细讲解了 Java 的内存区域划分和垃圾收集器
  • 第三部分(第6~9章),深入分析了class 文件结构、虚拟机的类加载机制
  • 第四部分(第10~11章),程序编译和代码优化
  • 第五部分(第12~13章),主要讲解了 Java 实现高并发的原理,包括线程与协程、锁优化等等。

总之一点,Java 虚拟机是成神之路上的巅峰之战!

再来说说 Java 源码。

面试的时候,面试官都特别喜欢问一些源码方面的知识,比如说 HashMap 的一些经典问题,加载因子为什么是 0.75?哈希冲突的时候,HashMap 是如何查找并确认元素的等等,这些问题只有通过源码才能得出比较准确的回答,对吧?

给大家推荐 B 站上一个视频,详细地介绍了如何阅读 Java 源码。

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

这里说一下 Java 源码阅读的顺序:

  • lang
  • util
  • io
  • nio
  • math
  • time
  • net

其中的重点:

  • String
  • Integer
  • ArrayList
  • LinkedList
  • CopyOnWriteArrayList
  • HashMap
  • TreeMap
  • LinkedHashMap
  • ConcurrentHashMap
  • CopyOnWriteArrayList

四、数据库

学习一门编程语言,如果不去操作下数据,就感觉这门编程语言空有皮囊却没有灵魂,对吧?所以数据库部分是必学的。

先说书。

《SQL 必知必会》是麻省理工学院、伊利诺伊大学等众多大学的参考教材,这本书直接从 SQL 的 SELECT 开始,讲述了实际工作环境中最常用和最必需的 SQL 知识,实用性极强。该书作者后来还出了一本《MySQL 必知必会》,同样很薄的一本书,也可以看一看。

《高性能 MySQL》,业界公认的一本经典的 MySQL 读物了,有着广泛的影响力。


目前大多数公司的存储都是 MySQL + Redis,MySQL 作为主要的存储方式,Redis 作为缓存,用来加快热点数据的读写速度,从而提高性能。所以学完 MySQL,可以趁热打铁学一下 Redis。

《Redis 深入历险核心原理与应用实战》分为基础和应用篇、原理篇、集群篇、拓展篇、源码篇共 5
大块内容。基础和应用篇讲解对读者来说最有价值的内容,可以直接应用到实际工作中;原理篇、集群篇让开发者透过简单的技术表面看到精致的底层世界;拓展篇帮助读者拓展技术视野和夯实基础,便于进阶学习;源码篇让高阶的读者能够读懂源码,掌握核心技术实力。

Redis 的重要性不言而喻了,是互联网技术架构在存储系统中最为广泛的中间件,也是后端面试中最经常被问到的模块之一。

《MongoDB 权威指南》是一本广受好评的 MongoDB 权威著作,作者是谷歌的一名软件工程师,曾有 5 年是 MongoDB 项目的核心成员。

再来说说推荐的视频。

SQL 推荐 B 站上一个老外的课,英文中字版的,内容制作得非常棒,所以完全不用担心听不懂。10 个小时就能看完。

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

MySQL 的推荐 B 站上的一个女老师的,讲得很精彩,弹幕也很精彩。

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

Redis 的也推荐一个:

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

Redis 是面试中经常考的一块知识点,像下面这些经常被问,参考自老钱的文章

  • Redis 有哪些数据结构?
  • 使用过Redis分布式锁么,它是什么回事?
  • 假如Redis里面有1亿个key,其中有10w个key是以某个固定的已知的前缀开头的,如果将它们全部找出来?
  • 使用过Redis做异步队列么,你是怎么用的?
  • 如果有大量的key需要设置同一时间过期,一般需要注意什么?
  • Redis如何做持久化的?
  • Pipeline有什么好处,为什么要用pipeline?
  • Redis的同步机制了解么?
  • 是否使用过Redis集群,集群的原理是什么?

五、计算机组成原理

众所周知,计算机是由 CPU、内存、显示器这些设备组成的硬件,但我们大学毕业后,往往从事的是软件方面的开发工作。那怎样才能在硬件和软件之间自由穿梭呢?答案就是学好计算机组成原理。弄明白了计算机的组成原理,也就对整个软件开发有了一个系统的认知,不论是计算机的硬件原理,还是软件架构,都能很好的驾驭,随之而来的,我们的职业发展机会也就更多了。

计算机组成原理这门课完全可以用一个词来概括,就是“抽象”。在我看来这也是整个计算机设计中所蕴含的的灵魂。《计算机是怎样跑起来的》,很适合作为一本了解计算机的入门书。在外人看来,计算机很复杂,对内行人来说,计算机说起来很简单:

  • 输入、运算、输出是硬件的基础
  • 软件是数据和指令的集合
  • 计算机和人的思考方式不同,对计算机来说,什么都是数字

既然聊到计算机,很有必要给大家推荐 B 站上的一门计算机科学速成课,讲解的内容有:

计算机早期历史
电子计算机
布尔逻辑
二进制
算术逻辑单元
寄存器 & 内存
中央处理器
指令和程序
高级 CPU 设计
早期的编程方式
编程语言发展史
编程原理
算法入门
数据结构
阿兰图灵(我最喜欢的一集)
软件工程
集成电路 & 摩尔定律
操作系统
内存 & 储存介质
文件系统
压缩
命令行界面
屏幕 & 2D 图形显示
个人计算机革命
图形用户界面
3D 图形
计算机网络
互联网
万维网
计算机安全
黑客 & 攻击
加密
机器学习 & 人工智能
计算机视觉
自然语言处理
机器人
计算机心理学
天网 & 计算机的未来

非常值得每个程序员去刷一刷的,全部都是计算机专业需要掌握的知识点啊,至少是应该了解的知识点。关键是视频的画面特别精良,我来截幅图给大家感受下。


关键是英文中字版的,观看起来毫无压力。我自己每天会刷一集。像二进制这一集,以前经常被二进制搞得晕头转向,刷了这集视频后,明显感觉对二进制没那么生疏了,仿佛一个陌生人坐在对面,喝了一杯酒后,就成了老熟人。

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

我看弹幕有人说,“第一次用 B 站看这么正经的东西。”好他喵的真实呀!我也是。

最后再推荐一本书,《编码-印尼在计算机软硬件背后的语言》,这本书讲述的是计算机背后的工作原理。

你是否想知道计算机如何工作和运行的?
你是否想了解计算机是如何一步一步创造出来的?
你是否想了解计算机知识的来龙去脉?
你是否想了解计算机的历史?
你是否想制造出一台自己的计算机?
你是否想知道硬件与软件的区别?
你是否想知道电报机、电的原理?
你是否想创造自己的编程语言?
你是否想知道你买的电脑中说明书上说的主频、内存、显示器象素、显存的概念和意义?
你是否想知道我们常用的十进制的由来?
你是否一直迷惑于二进制的理解?
你是否想知道那些赫赫有名的IT公司的历史和发展?
你是否想探询那些天才是如何思考和发明的?
你是否想象科学家一样思考?

这一连串问答摘自豆瓣书评

这本书将一一为你揭开谜底。本书的内容涉及数理逻辑、布尔代数、组合数学、集合、物理、化学和电子学等等知识。

六、计算机网络

当今这个时代,没有网络简直无法生存,哪怕是在电梯里的一分钟,我都受不了那种手机没有网络的状态。我们所学的编程知识,如果脱离了网络,将变得毫无意义,因为没有哪个编程语言是要在单机环境下运行的。

计算机网络课怎么学习,给大家推荐四本书,一门公开课。

《网络是怎样连接的》,这本书从在浏览器中输入网址开始,一路追踪到显示出网页内容为止的整个过程,以图配文,讲解了网络的全貌,并重点介绍了网络设备和软件是如何工作的。
在这里插入图片描述

《TCP/IP 详解》,这是一本完整而详细的 TCP/IP 协议指南,基本上做通信的是人手一本。对于大多数程序员来说,了解这个 TCP/IP 对面试和编程也有很大的帮助。

在这里插入图片描述

《图解 HTTP》,HTTP协议是互联网的基石,学完后可以尝试实现一个属于自己的 HTTP 服务器了。
在这里插入图片描述

《计算机网络-自顶向下方法》,算是一本经典的大学教材了,
在这里插入图片描述

关于计算机网络这块,可以配合 B 站上的《计算机网络微课堂》一起来学习。

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

这门课主要介绍了计算机网络的基本概念和基本原理,从下到上依次讲解物理层、数据链路层、网络层、运输层和应用层,以因特网和网络技术为实例,深入讲解和分析了计算机网络的基本原理、方法和技术精髓。这门课程学完后,你将:

  • 轻松学懂计算机网络,掌握相关的理论基础。
  • 对于要参加 408 考研的同学,可以从容应考。
  • 如果将来要从事计算机网络相关的科研,也能打下坚实的基础。

七、计算机操作系统

为什么要学习操作系统呢?

第一,面试要考;

第二,无论学习哪门子编程语言,比如说 Java、C/C++,都需要和操作系统打交道,像 Java 中的多线程技术,其实是由操作系统来负责进程和线程管理的;

第三,学习操作系统,还能学到内存分配方面的知识。

同样推荐两本书,《深入理解计算机系统》和《鸟哥的Linux私房菜 基础学习》。

《深入理解计算机系统》,按理说,这本书的名字应该叫《计算机系统导论》,有 C语言、数据结构的知识就可以学这本书了,想在毕业后去大厂的学弟学妹值得花时间去三刷一下这本书,注意是三刷,第一刷大致了解,第二刷精度,第三刷温习。可以说得上是程序员了解计算机系统的最佳书籍了,可以去 CSAPP 课程官网找 Lab 配合刷起来。


《鸟哥的Linux私房菜 基础学习》,这是一本 Linux 方面的畅销书了,全面详细地介绍了 Linux 操作系统,如果要学习 Linux 的话,首选。

八、数据结构与算法

无论什么时候,程序=数据结构+算法这种说法都是成立的。

常用的数据结构有:

  • 栈:栈是一种非常有用的数据结构,它就像一摞盘子,第一个放在最下面,第二个放在第一个上面,第三个放在第二个上面,最后一个放在最上面。栈遵循后进先出的原则,也就是“Last In First Out”(简称 LIFO)——最后的一个进的,最先出去。
  • 队列:只允许在队尾添加数据,队首移除数据。队列在 Java 中的出现频率非常高,有各种不同的类来满足不同的场景需求。像优先级队列 PriorityQueue、延时队列 DelayQueue 等等。队列遵循的是First In First Out,缩写为FIFO,也就是先进先出,第一个进入队列的第一个先出来。
  • 数组:数组这种数据结构最大的好处,就是可以根据下标(或者叫索引)进行操作,插入的时候可以根据下标直接插入到具体的位置,但与此同时,后面的元素就需要全部向后移动,需要移动的数据越多,就越累。
  • 链表:链表在物理存储空间是不连续的,但每个节点要么知道它的下一个节点是谁,要么知道它的上一个节点是谁,仿佛就像我们之间隔着千山万水,却心有灵犀一点链。像 LinkedList 就是最典型的链表结构,通过引用相互链接。
  • 树:树是一种典型的非线性结构,它是由 n(n>0)个有限节点组成的一个具有层次关系的集合。之所以叫“树”,是因为这种数据结构看起来就像是一个倒挂的树,只不过根在上,叶在下。
  • 哈希表:也叫散列表,是一种可以通过关键码值(key-value)直接访问的数据结构,它最大的特点就是可以快速实现查找、插入和删除。
  • 图:图是一种复杂的非线性结构,由顶点的有穷非空集合和顶点之间边的集合组成,通常表示为:G(V,E),其中,G 表示一个图,V 是图 G 中顶点的集合,E 是图 G 中边的集合。

常用的算法有:

  • 查找
  • 插入
  • 删除
  • 更新
  • 排序

算法研究的目的是为了更有效的处理数据,提高数据运算的效率,数据运算是定义在数据结构上的,各大公司的笔试基本都考这个,《剑指 Offer》上的所有题目如果能背下来,LeetCode 上的题如果能刷个一百到三百道,ACM 竞赛如果能拿到一些奖项。在找工作的时候会非常有优势,基本上大厂小厂的 offer 可能会拿到手软。

刷完 300 道 LeetCode 题后,我强到可以和面试官硬刚!纯正 Java 版

视频的话,推荐 B 站上的一个,韩顺平老师的。

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

评论区有同学给出了数据结构与算法在面试中经常考的知识点,和视频是关联的:

  • P16~P23 单链表
  • P24~P26 双向链表
  • P27~P29 约瑟夫环
  • P30~P35 栈·栈实现计算器
  • P36~P42 前缀,中缀,后缀表达式,逆波兰计算器的实现
  • P43~P49 递归,迷宫回溯,八皇后
  • P50~P53 排序算法基础
  • 54~56 冒泡排序
  • 57~59 选择排序
  • 60~62 插入排序
  • 63~65 希尔排序
  • 66~68 快速排序
  • 69~71 归并排序
  • 72~75 基数排序
  • 76 各种排序的比较
  • 127~131 二叉排序树
  • 132~134 BST删除一棵子树的节点
  • 135 二叉平衡树
  • 146~151 图,图的深度优先和广度优先
  • 156~159 动态规划
  • 160~163 暴力匹配和KMP算法
  • 164~ 167 贪心算法

顺带说一下,我上面总结的这套体系是非常完备的,可以说拿到任何地方都是有公信力的,几乎完美到无可挑剔(自信有点上头)。

如果你很幸运的,从大一就看到了这个学习路线,那么恭喜你,实习 Offer 可以说是手到擒来了!如果稍微有那么一点不走运,看到的比较晚,那么一句很鸡贼的话送给你,“种一棵树最好的时间要么是十年前,要么是现在。”

我是二哥呀!记得给二哥点赞,好不好?(偷偷搜藏也行)