假如有那么残酷的一天,我不小心喝错了一瓶药,一下子抹掉了我这十多年的编程经验,把我变成了一只小白。我想自学 Java,并且想要找到一份工作,我预计需要 6 个月的时间,前提条件是每天都处于高效率的学习状态当中,并且每天的学习时间至少在 12 个小时以上。
即便是这样,我敢肯定,找到的工作肯定不会太好,勉强能够维持生活吧,毕竟是零基础入门啊。
如果想更进一步,真正成为一名不可或缺的高级 Java 工程师,时间需要更久,两年、三年、五年,直到秃的那天。
想着想着,我就觉得有必要为那一天做点准备,以备不时之需。
01、第一个阶段,环境和工具准备准备一台电脑,要能联网
下载、安装 JDK,配置 Java 开发环境
下载、配置 Maven
下载、安装 IntelliJ IDEA
准备一个 GitHub 仓库(或者码云),管理 Java 源代码
Java 是一门计算机编程语言,学它的话,连台电脑都没有,学个屁。我有个亲戚家的孩子想学编程,就只看书,家里连台电脑都不配,说什么“先打好理论基础,再实操”,我真的是有点醉。
有了电脑,还得联网,自学的过程中肯定会遇到很多问题,遇到问题的时候先问搜索引擎,推荐谷歌和必应;实在没有答案的话,也可以来找我,申请加入技术交流群,问问群里面的大佬们。
既然要学 Java,JDK 是必须要先安装的,否则 Java 程序就没法编译和执行。
Maven 也是需要提前安装和配置的,因为后面进阶的话,需要一些练手项目,它们通常都需要 Maven 来加载第三方类库。
使用集成开发环境 IntelliJ IDEA 来敲 Java 代码吧,比 Eclipse 更流行。千万不要使用记事本编写源代码了,对于小白来说,时间是宝贵的,记事本只适合大牛们用来装逼,不适合小白用来编程(入门),纯浪费时间。
有了 IDEA,后面学习源码的话,就会方便很多,包括反编译字节码。
如果英语功底不太好的话,建议安装这两款 IDEA 插件:chinese 和 translation。
如果注重编码规范的话,建议安装这两款 IDEA 插件:Alibaba 和 SonarLint。
为什么还需要 GitHub 仓库或者码云仓库呢?它们可以用来在线云同步源代码,防止版本丢失。学到最后,还可以形成一套自己的工具库,轮子就有了,上班的时候工作效率就会高很多,能直接用的代码再也不用重新写了。
02、第二个阶段,Java 基础入门1)基本数据类型
8 种基本数据类型(boolean、char、byte、short、int、long、float、double)
整形中 byte、short、int、long 的取值范围
单精度和双精度
为什么不能使用“==”比较浮点数
基本类型和包装类型的区别
自动拆箱与装箱
Integer 的缓存机制
2)操作符
算术运算符
逻辑运算符
比较运算符
3)流程控制语句
条件分支(if/else/else if、三元运算符、switch)
循环或者遍历(for、while、do-while)
break 和 continue
4)包
创建包
导入包
包全名
5)main 方法详解
public 关键字
static 关键字
void 关键字
main 方法
字符串数组参数(String[] args)
6)数组
什么是数组?
访问数组
遍历数组
打印数组
可变参数
数组排序
数组转成 Stream
数组转成 List
数组搜索
java.util.Arrays
数组越界
7)注释
单行注释
多行注释
文档注释
注释真的不会被执行吗?
优秀的程序员真的不写注释吗
8)字符串
双引号字符串和 new 字符串对象
字符串为什么是不可变的?
String、StringBuilder 和 StringBuffer 之间的区别
字符串拼接的几种方式
字符串常量池
关于 intern
字符串比较(== 和 equals)
字符串拆分
字符串操作小技巧
字符串转整形
生成 UUID
字符串可以引用传递吗?
字符串长度
关于 substring
03、第三个阶段,Java 核心技术1)面向对象
面向对象和面向过程
封装
继承
多态
接口
抽象类
重写和重载
构造方法
局部变量、成员变量、静态变量、常量
值传递还是引用传递
final 关键字
this 关键字
super 关键字
不可变对象
equals() 和 hashCode()
打印 Java 对象
NullPointerException
2)常用工具类
字符串相关的工具类
日期时间相关的工具类
枚举
随机数
正则表达式
Apache-commons 工具库
Guava 工具库
3)集合框架
ArrayList
LinkedList
ArrayList 和 LinkedList 之间的区别
不可变 List
CopyOnWriteArrayList
HashMap
LinkedHashMap
TreeMap
ConcurrentHashMap
fail-fast
4)反射机制
什么是反射?
反射有什么用?
Class 类
5)异常处理
为什么需要异常处理机制?
Error 和 Exception
try-catch-finally
try-with-resource
自定义异常
尽量捕获原始异常
不要打印堆栈后再抛出异常
不要用异常处理机制代替判断
不要过早捕获异常
6)注解
注解是什么?
注解的生命周期
注解装饰的目标
自定义注解
使用注解
7)IO 流
字符流、字节流
输入流、输出流
同步、异步
阻塞、非阻塞
BIO、NIO 和 AIO
NIO 2.0
8)序列化
什么是序列化和反序列化
Java 如何实现序列化和反序列化
Serializbale 和 Externalizable
serialVersionUID
9)泛型
什么是泛型?
类型擦除
泛型带来的问题
泛型中 K T V E 这些特殊字幕的含义
通配符
上下界限定符 extends 和 super
不要在集合中使用 Java 原始类型
10)单元测试
Junit
TestNG
11)编码方式
ASCII
Unicode
UTF-8
GBK、GB2312
如何解决乱码问题
12)并发编程
什么是并发
什么是并行
什么是线程
什么是进程
线程的状态
线程的优先级
创建线程
创建线程池
什么是线程安全
多级缓存和一致性问题
CPU 时间片和原子性问题
指令重排和有序性问题
线程安全和内存模型
happens-before
可重入锁
阻塞锁
乐观锁
悲观锁
分布式锁
CAS
ABA
偏向锁
轻量级锁
重量级锁
自旋锁
什么是死锁
如果避免死锁
synchronized
volatile
ThreadLocal
Executors
CountDownLatch
Thread
Runnable
Callable
ReentrantLock
ReentrantReadWriteLock
Atomic 相关类
13)Java 8 新特性
Lambda 表达式
Stream流
Optional
14)源码阅读
String
Integer
ArrayList
LinkedList
CopyOnWriteArrayList
HashMap
TreeMap
LinkedHashMap
ConcurrentHashMap
CopyOnWriteArrayList
04、第四个阶段,Java 进阶升级1)JVM
Java 内存结构
堆
栈
垃圾回收
JVM 参数调优
Java 对象模型
HotSpot
类加载机制
编译和反编译
反编译工具
JIT
虚拟机性能监控和故障处理工具(jps、jstack、jmap、jstat、jconsole、javap)
2)性能优化
使用单例
使用线程池
减少上下文切换
减小锁粒度
数据压缩
Stream 并行流
GC 调优
JVM 内存分配调优
btrace
3)设计模式
设计模式的六大原则
创建型设计模式(单例、抽象工厂、建造者、工厂、原型)
结构型设计模式(适配器、桥接、装饰、组合、外观、享元、代理)
行为型设计模式(模板方法、命令、迭代器、观察者、中介者、备忘录、解释器、状态、策略、责任链、访问者)
单例的七种写法
4)数据结构和算法
简单的数据结构(栈、队列、链表、数组、哈希表)
树(二叉树、字典树、平衡树、排序树、B 树、B+ 树、R 树、红黑树、多路树)
堆
图(拓扑、有向图、无向图)