先说结论:计算机基础不影响你入门以及掌握编程语言。但是,想要搞懂其本质,还是需要有计算机基础知识的。另外,学习强度比较高的话大概需要半年,学习强度正常水平的话大概需要1年。 对于没有任何编程基础的小伙伴来说,这个时间或许还要继续延长一些。
以下内容为@JavaGuide原创,请勿搬运!如果帮助,还请各位看官老爷点个赞鼓励一下啊!
文章中的相关书籍我也已经同步到了 Github和Gitee上(有PDF版本可供下载),欢迎小伙伴们一起完善。
聊聊个人经历
拿我自己来说吧!我本科学校很一般,荆州的一所双非一本。在大二上学期末,最终确定了自己以后要走的技术方向是走 Java 后端。于是,我就开始制定学习计划,开始了自己的 Java 后端领域的打怪升级之路。
到了大三,我基本把 Java 后端领域一些必备的技术都给过了一遍,还用自己学的东西做了两个实战项目。整个过程一共花了我一个暑假+半个学期,每天的学习强度基本都在 10个小时以上。
一个是跟着老师一起做的绩效考核系统,类似下图这样。
一个是跟着网上视频做的分布式商城系统,自己对于其中的一些地方做了简单改进和优化,比如增加了缓存Redis。
如果你想让自己的简历更好看的话,记得多做一些实战项目!我已经将一些我觉得不错的实战项目打包,欢迎自取!
后来,秋招我去参加面试的公司都顺利拿到的 offer。个人比较追求 Life Balance 就去了武汉的ThoughtWorks ,一家外企。
不过,刚上大学那会,我真就像一个憨憨。整个大一,我都没有怎么认真学习编程,每天就是出去玩,还有参加各种社团活动。下面这张是我大一的一次徒步旅行(40多公里的路程)。
由于缺少正确的人指导,我当时学的时候也走了很多弯路,浪费了不少时间(我很羡慕大家能有我,就很厚脸皮!)。该学的都学的差不多之后,我就开始准备面试了。
对于每一门技术,我会去网上找一些常见的面试题,并把这些面试题作为重点来复习!同时,掌握这些面试题,又让我对这门技术有了更深刻的认识。我当时每天的任务基本就是刷刷算法题,写写代码,总结一下常见的面试问题。
这个期间还接过一些外包做(大三下学期实现经济独立,还赚了一些钱),还和一些朋友参加了一个软件设计大赛。这让我的编码能力有了非常大的进步。并且,让我的简历也有了更多可以写的东西。
聊聊Java学习路线
2021最新版 Java学习路线已近更新!可能是你看过最用心、最全面的 Java 后端学习路线。
多说一句,对于编程初学者,我不太建议上来通过做项目学习。实践确实很重要,如果你没有编程基础的话,直接上手实战,很容易最后学个四不像。
建议你在学习编程的初期尽量多看一些优质视频。跟着视频一步一步走,可以让你少踩很多坑,学习编程的信心也会增加。
概览:
回答中的相关书籍我也已经同步到了 Github和Gitee上(有PDF版本可供下载),欢迎小伙伴们一起完善。
Java 基础
如果你之前没有学习过编程的话,我建议你可以看看视频教程。
像尚硅谷的 《 Java 基础教程系列》和韩顺平老师的《零基础 30 天学会 Java》就很不错。
学习过 Java 的朋友,大部分应该都看过韩老师的课程吧!韩老师毕业于清华大学,录制的视频课程质量都非常高。内容易懂,并且不失严谨。
韩老师的《零基础 30 天学会 Java》系列不光会教你 Java 基础,还会帮你建立编程思想,让你知道学习了 Java 之后,你可以从事什么工作。
看视频的同时,配套一本好书也是非常有作用的。
这本书在是入门 Java 的很不错的书籍 。
《Head First Java》这本书的内容很轻松有趣,可以说是我学习编程初期最喜欢的几本书之一了。同时,这本书也是我的 Java 启蒙书籍。我在学习 Java 的初期多亏了这本书的帮助,自己才算是跨进 Java 语言的大门。
我觉得我在 Java 这块能够坚持下来,这本书有很大的功劳。我身边的的很多朋友学习 Java 初期都是看的这本书。
有很多小伙伴就会问了:这本书适不适合编程新手阅读呢?
我个人觉得这本书还是挺适合编程新手阅读的,毕竟是 “Head First” 系列。
这两本书也非常不错。不过,这两本书的内容很多,全看的话比较费时间。我现在是把这两本书当做工具书来用,就比如我平时写文章的时候,碰到一些 Java 基础方面的问题,经常就翻看这两本来当做参考!
我当时在大学的时候就买了两本放在寝室,没事的时候就翻翻。建议有点 Java 基础之后再读,介绍的还是比较深入和全面的,非常推荐。
这本书被很多人称之为 Java 领域的圣经(感觉有点过了~~~)。不太推荐编程初学者阅读,有点劝退的味道,稍微有点基础后阅读更好。
我第一次看的时候还觉得有点枯燥,那时候还在上大二,看了 1/3 就没看下去了。
另外,Java 8 算是一个里程碑式的版本,现在一般企业还是用 Java 8 比较多。掌握 Java 8 的一些新特性比如 Lambda、Strean API 还是挺有必要的。这块的话,我推荐 这本书。
学完 Java 基础之后,你可以用自己学的东西实现一个简单的 Java 程序,也可以尝试用 Java 解决一些编程问题,以此来将自己学到的东西付诸于实践。
不太建议学习 Java 基础的之后通过做游戏来巩固。为什么培训班喜欢通过这种方式呢?说白点就是为了找到你的 G 点。新手学习完 Java 基础后做游戏一般是不太现实的,还不如找一些简单的程序问题解决一下比如简单的算法题。
记得多总结!打好基础!把自己重要的东西都记录下来。 API 文档放在自己可以看到的地方,以备自己可以随时查阅。为了能让自己写出更优秀的代码,《Effective Java》、《重构》 这两本书没事也可以看
并发
多线程这部分内容稍微会比较难以理解和实践。如果你刚学完 Java 基础的话,我建议你学习并发这部分内容的时候,可以先简单地了解一下基础知识比如线程和进程的对比。到了后面,你对于 Java 了解的更深了之后,再回来仔细看看这部分的内容。
下面是一些我比较推荐的书籍。
这本书还是非常适合我们用来学习 Java 多线程的。这本书的讲解非常通俗易懂,作者从并发编程基础到实战都是信手拈来。
另外,这本书的作者加多自身也会经常在网上发布各种技术文章。这本书也是加多大佬这么多年在多线程领域的沉淀所得的结果吧!他书中的内容基本都是结合代码讲解,非常有说服力!
这个是我第二本要推荐的书籍,比较适合作为多线程入门/进阶书籍来看。这本书内容同样是理论结合实战,对于每个知识点的讲解也比较通俗易懂,整体结构也比较清。
这本书是几位大厂的大佬开源的。
这几位作者为了写好《深入浅出 Java 多线程》这本书阅读了大量的 Java 多线程方面的书籍和博客,然后再加上他们的经验总结、Demo 实例、源码解析,最终才形成了这本书。
这本书的质量也是非常过硬!给作者们点个赞!这本书有统一的排版规则和语言风格、清晰的表达方式和逻辑。并且每篇文章初稿写完后,作者们就会互相审校,合并到主分支时所有成员会再次审校,最后再通篇修订了三遍。
这本书是去年也就是 2020 年新出的,所以,现在知道的人还不是很多。
这本书主要是对 Java Concurrent 包中一些比较重要的源码进行了讲解,另外,像 JMM、happen-before、CAS 等等比较重要的并发知识这本书也都会一并介绍到。
不论是你想要深入研究 Java 并发,还是说要准备面试,你都可以看看这本书。
下面是我总结的一些关于并发的小问题,你可以拿来自测:
- 什么是线程和进程? 线程与进程的关系,区别及优缺点?
- 说说并发与并行的区别?
- 为什么要使用多线程呢?
- 使用多线程可能带来什么问题?(内存泄漏、死锁、线程不安全等等)
- 创建线程有哪几种方式?(a.继承 Thread 类;b.实现 Runnable 接口;c. 使用 Executor 框架;d.使用 FutureTask)
- 说说线程的生命周期和状态?
- 什么是上下文切换?
- 什么是线程死锁?如何避免死锁?
- 说说 sleep() 方法和 wait() 方法区别和共同点?
- Java 内存模型(JMM)、重排序与 happens-before 原则了解吗?
- synchronized 关键字、volatile 关键字
- ThreadLocal 有啥用(解决了什么问题)?怎么用?原理了解吗?内存泄露问题了解吗?
- 为什么要用线程池?ThreadPoolExecutor 类的重要参数了解吗?ThreadPoolExecutor 饱和策略了解吗?线程池原理了解吗?几种常见的线程池了解吗?为什么不推荐使用FixedThreadPool?如何设置线程池的大小?
- AQS 了解么?原理?AQS 常用组件:Semaphore (信号量)、CountDownLatch (倒计时器) CyclicBarrier(循环栅栏)
- ReentrantLock 、 ReentrantReadWriteLock 、StampedLock(JDK8)
- CAS 了解么?原理?
- Atomic 原子类
- 并发容器:ConcurrentHashMap 、 CopyOnWriteArrayList 、 ConcurrentLinkedQueue BlockingQueue 、ConcurrentSkipListMap
- Future 和 CompletableFuture
- ……
JVM
对于 Java 程序员来说,JVM 帮助我们做了很多事情比如内存管理、垃圾回收等等。在 JVM 的帮助下,我们的程序出现内存泄漏这些问题的概率相对来说是比较低的。但是,这并不代表我们在日常开发工作中不会遇到。万一你在工作中遇到了 OOM 问题,你至少要知道如何去排查和解决问题吧!
并且,就单纯从面试角度来说,JVM 是 Java 后端面试(大厂)中非常重要的一环。不论是应届还是社招,面试国内的一些大厂,你都会被问到很多 JVM 相关的问题(应届的话侧重理论,社招实践)。
只有搞懂了 JVM 才有可能真正把 Java 语言“吃透”。学习 JVM 这部分的内容,一定要注意要实战和理论结合。
书籍的话, 这本书是首先要推荐的。
这本书就一句话形容:国产书籍中的战斗机,实实在在的优秀! (真心希望国内能有更多这样的优质书籍出现!加油! )
这本书的第三版去年年底已经出来了,新增了很多实在的内容比如 ZGC 等新一代 GC 的原理剖析。目前豆瓣上是 9.6 的高分, 不 我就不多说了!
不论是你面试还是你想要在 Java 领域学习的更深,你都离不开这本书籍。这本书不光要看,你还要多看几遍,里面都是干货。这本书里面还有一些需要自己实践的东西,我建议你也跟着实践一下。
类似的书籍还有 、 ,这两本都是非常不错的!
如果你对实战比较感兴趣,想要自己动手写一个简易的 JVM 的话,可以看看 这本书。
书中的代码是基于 Go 语言实现的,搞懂了原理之后,你可以使用 Java 语言模仿着写一个,也算是练练手! 如果你当前没有能力独立使用 Java 语言模仿着写一个的话,你也可以在网上找到很多基于 Java 语言版本的实现,比如《zachaxy 的手写 JVM 系列》 。
这本书目前在豆瓣有 8.2 的评分,我个人觉得张秀宏老师写的挺好的,这本书值得更高的评分。
另外,R 大在豆瓣发的《从表到里学习 JVM 实现》这篇文章中也推荐了很多不错的 JVM 相关的书籍,推荐小伙伴们去看看。
再推荐两个视频给喜欢看视频学习的小伙伴。
第 1 个是尚硅谷的宋红康老师讲的《JVM 全套教程》。这个课程的内容非常硬,一共有接近 400 小节。
课程的内容分为 3 部分:
- 《内存与垃圾回收篇》
- 《字节码与类的加载篇》
- 《性能监控与调优篇》
第 2 个是你假笨大佬的 教程,很厉害了!
下面是我总结的一些关于 JVM 的小问题,你可以拿来自测:
- 什么是虚拟机?
- Java 内存区域是怎么划分的?大对象放在哪个内存区域?
- 垃圾回收有哪些算法?GC 的流程
- 什么是类加载?何时类加载?类加载流程?
- 知道哪些类加载器。类加载器之间的关系?
- 类加载器的双亲委派了解么? 结合 Tomcat 说一下双亲委派(Tomcat 如何打破双亲委托机制?…)。
- 常见调优参数有哪些?
- ……
数据库
我们网站或 者 APP 的数据都是需要使用数据库来存储数据的。
MySQL
一般企业项目开发中,使用 MySQL 比较多。如果你要学习 MySQL 的话,可以看下面这 3 本书籍:
视频的话,你可以看看动力节点的 《MySQL 数据库教程视频》。这个视频基本上把 MySQL 的相关一些入门知识给介绍完了。
学习了 MySQL 之后,务必确保自己掌握下面这些知识点:
- MySQL 常用命令 :
- 安全:登录、增加/删除用户、备份数据和还原数据
- 数据库操作: 建库建表/删库删表、用户权限分配
- ……
- MySQL 中常用的数据类型、字符集编码
- MySQL 简单查询、条件查询、模糊查询、多表查询以及如何对查询结果排序、过滤、分组……
- MySQL 中使用索引、视图、存储过程、游标、触发器
- ……
如果你想让自己更加了解 MySQL ,同时也是为了准备面试的话,下面这些知识点要格外注意:
- 索引:索引优缺点、B 树和 B+树、聚集索引与非聚集索引、覆盖索引
- 事务:事务、数据库事务、ACID、并发事务、事务隔离级别
- 存储引擎(MyISAM 和 InnoDB)
- 锁机制与 InnoDB 锁算法
Redis
Redis 就是一个使用 C 语言开发的数据库,不过与传统数据库不同的是 Redis 的数据是存在内存中的 ,也就是它是内存数据库,所以读写速度非常快,因此 Redis 被广泛应用于缓存方向。
如果你要学习 Redis 的话,强烈推荐 和 这两本书。另外, 这本书也非常不错,既有基础介绍,又有一线开发运维经验分享。
下面是我总结的一些关于并发的小问题,你可以拿来自测:
- Redis 和 Memcached 的区别和共同点
- 为什么要用 Redis/为什么要用缓存?
- Redis 常见数据结构以及使用场景分析
- Redis 没有使用多线程?为什么不使用多线程?Redis6.0 之后为何引入了多线程?
- Redis 给缓存数据设置过期时间有啥用?
- Redis 是如何判断数据是否过期的呢?
- 过期的数据的删除策略了解么?
- Redis 内存淘汰机制了解么?
- Redis 持久化机制(怎么保证 Redis 挂掉之后再重启数据可以进行恢复)
- Redis 缓存穿透、缓存雪崩?
- 如何保证缓存和数据库数据的一致性?
- ……
常用工具
非常重要!非常重要!特别是 Git 和 Docker。
除了下面这些工具之外,我强烈建议你一定要搞懂 Github 的使用。一些使用 Github 的小技巧,你可以看《Github 小技巧》这篇文章。
IDEA
俗话说:“工欲善其事,必先利其器 !”。选择一款好的开发工具对于我们高效率编码非常有帮助!
常用的 Java 开发工具就 Eclipse 和 IDEA。就我个人而言 IDEA 是最适合 Java 开发者的 IDE 。
建议你要熟悉 IDEA 的基本操作以及常用快捷。你可以通过 Github 上的开源教程 《IntelliJ IDEA 简体中文专题教程》 来学习 IDEA 的相关使用。
除了 IDEA 自身对编码优秀的支持(比如智能上下文提示)之外,IDEA 中还有丰富的插件来帮助我们高效开发。《IDEA 插件》 这个系列专辑中推荐了很多实用 IDEA 必备的插件!
Maven
强烈建议学习常用框架之前可以提前花几天时间学习一下Maven的使用。(到处找 Jar 包,下载 Jar 包是真的麻烦费事,使用 Maven 可以为你省很多事情)。
Git
Git 技能对于程序员来说也是必备的!试着在学习的过程中将自己的代码托管在 Github 上,有一个漂亮的 Github 主页在求职面试中是十分加分的。并且,现在的企业都是基于 Git 在 GitHub 或 GitLab 平台上做版本控制。
学习 Git 的话,强烈推荐给大家一个可以交互式学习 Git 的网站 Learn Git Branching。效果真的非常非常棒,通过游戏的方式让你学习 Git 的常见操作。
整个教程分为很多关,每一关都有非常详细的指导,还会有详细的动图展示结果。并且,你做错了之后还可以使用 reset 命令从头开始。
如果你是在不知道答案的话,还可以使用 show solution 命令查看答案。
这种即时反馈的学习让过程变得有趣!真心感谢这个网站的作者,太爱了!
另外,你可以看看 Github 上开源的这篇 《Git 极简入门》 ,像版本控制和 Git 的相关概念、Git 常见操作这篇文章都有介绍到。
如果想要详细了解 Git 的话,Git 官方文档教程是肯定要看的,介绍的非常全面,并且有中文版!
《Pro Git》这本书也非常不错,还有中文版,内容非常全面,硬核!
如果你比较喜欢看视频教程的话,可以看看极客时间的《玩转 Git 三剑客》,课程的作者是携程代码平台负责人苏玲,讲的挺不错的!
Docker
传统的开发流程中,我们的项目通常需要使用 MySQL、Redis、FastDFS 等等环境,这些环境都是需要我们手动去进行下载并配置的,安装配置流程极其复杂,而且不同系统下的操作也不一样。
Docker 的出现完美地解决了这一问题,我们可以在容器中安装 MySQL、Redis 等软件环境,使得应用和环境架构分开,它的优势在于:
- 一致的运行环境,能够更轻松地迁移
- 对进程进行封装隔离,容器与容器之间互不影响,更高效地利用系统资源
- 可以通过镜像复制多个一致的容器
Docker 常见概念解读,可以看这篇 Github 上开源的这篇《Docker 基本概念解读》 ,从零到上手实战可以看《Docker 从入门到上手干事》这篇文章,内容非常详细!
另外,再给大家推荐一本质量非常高的开源书籍《Docker 从入门到实践》 ,这本书的内容非常新,毕竟书籍的内容是开源的,可以随时改进。
常用框架
Spring/SpringBoot
Spring 和 SpringBoot 真的很重要!
一定要搞懂 AOP 和 IOC 这两个概念。Spring 中 bean 的作用域与生命周期、SpringMVC 工作原理详解等等知识点都是非常重要的,一定要搞懂。
企业中做 Java 后端,你一定离不开 SpringBoot ,这个是必备的技能了!一定一定一定要学好!
像 SpringBoot 和一些常见技术的整合你也要知识怎么做,比如 SpringBoot 整合 MyBatis、 ElasticSearch、SpringSecurity、Redis 等等。
学习 Spring 的话,可以多看看 ,写的很详细。你可以在这里找到 Spring 全家桶的学习资源。
你也可以把 这本书作为学习 Spring 的参考资料。 这本书还是比较新的,目前已经出到了第 5 版,基于 Spring 5 来讲。
了解了 Spring 中的一些常见概念和基本用法之后,你就可以开始学习 Spring Boot 了。
当然了,Spring 其实并不是学习 Spring Boot 的前置基础,相比于 Spring 来说,Spring Boot 要更容易上手一些!如果你只是想使用 Spring Boot 来做项目的话,直接学 Spring Boot 就可以了。
不过,我建议你在学习 Spring Boot 之前,可以看看 。这些问题都是 Spring 比较重要的知识点,也是面试中经常会被问到的。
学习 Spring Boot 的话,还是建议可以多看看 ,写的很详细。
你也可以把 这本书作为学习 Spring Boot 的参考资料。
这本书的整体质量实际一般,你当做参考书来看就好了!
相比于 《Spring Boot 实战》这本书,我更推荐国人写的 。
这本书使用的 Spring Boot 2.0+的版本,还算比较新。整本书采用“知识点+实例”的形式编写,书籍的最后两章还有 2 个综合性的企业实战项目:
- 开发企业级通用的后台系统
- 实现一个类似“京东”的电子商务商城
作者在注意实战的过程中还不忘记对于一些重要的基础知识的讲解。
如果你想专研 Spring Boot 底层原理的话,可以看看 。
这本书稍微有点啰嗦,不过,原理介绍的比较清楚(不适合初学者)。
如果你比较喜欢看视频的话,推荐尚硅谷雷神的 。
这可能是全网质量最高并且免费的 Spring Boot 教程了,好评爆炸!
另外,Spring Boot 这块还有很多优质的开源教程,我已经整理好放到 awesome-java@SpringBoot 中了。
学习路线比较长,完整学习路线我放在了下面这个知乎回答中:
再推荐一个非常不错的 Java 教程类开源项目:JavaGuide 。我在大三开始准备秋招面试的时候,创建了 JavaGuide 这个项目。目前这个项目已经有 100k+的 star,相关阅读:《1049 天,100K!简单复盘!》 。
对于你学习 Java 以及准备 Java 方向的面试都很有帮助!正如作者说的那样,这是一份:涵盖大部分 Java 程序员所需要掌握的核心知识的 Java 学习+面试指南!
另外,这个项目还推出了一个专门为 Java/程序员面试而生的 PDF 版本!简直不要太棒!
最后再推荐一下《Java 面试进阶指北 打造个人的技术竞争力》 准备Java后端面试必备参考资料!
我是 Guide哥,拥抱开源,喜欢烹饪。开源项目 JavaGuide 作者,Github:Snailclimb - Overview 。未来几年,希望持续完善 JavaGuide,争取能够帮助更多学习 Java 的小伙伴!共勉!凎!
原创不易,欢迎点赞分享,欢迎关注 @JavaGuide,我会持续分享原创干货~
本回答为我本人原创,如需转载,还请注明出处啊!