拜托,别再问我怎么自学 Java 了!和盘托出

假如有那么残酷的一天,我不小心喝错了一瓶药,一下子抹掉了我这十多年的编程经验,把我变成了一只小白。我想自学 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 树、红黑树、多路树)

堆

图(拓扑、有向图、无向图)

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpzdwp.html