01、第 1 个小时,环境和工具准备
- 准备一台电脑,要能联网
- 下载、配置 Maven
- 下载、安装 IntelliJ IDEA
- 准备一个 GitHub 仓库(或者码云),管理 Java 源代码
Java 是一门计算机编程语言,学它的话,连台电脑都没有,学个屁。有了电脑,还得联网,遇到问题的时候就问搜索引擎,推荐谷歌和必应,搜索引擎用得好,几乎没有解决不了的问题。
Maven 是需要提前安装和配置的,因为后面进阶的话,需要一些练手项目,它们通常都需要 Maven 来加载第三方类库。
敲代码就用 IntelliJ IDEA 吧,千万别用记事本,否则 3 天时间真学不会!有了 IDEA,连 JDK 都可以直接下载了,舒服啊!后面学习源码的话,还可以直接反编译字节码。什么?英语功底不行,安装这两款 IDEA 插件啊:中文汉化包和 translation 翻译插件。
为什么还需要 GitHub 仓库或者码云仓库呢?它们可以用来在线云同步源代码,防止版本丢失。学到最后,还可以形成一套自己的工具库,轮子就有了,上班的时候工作效率就会高很多,能直接用的代码再也不用重新写了。
02、第 2 - 12 个小时,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 方法详解
6)数组
- 什么是数组?
- 访问数组
- 遍历数组
- 打印数组
- 可变参数
- 数组排序
- 数组转成
Stream
- 数组转成
List
- 数组搜索
java.util.Arrays
- 数组越界
7)注释
- 单行注释
- 多行注释
- 文档注释
- 注释真的不会被执行吗?
8)字符串
- 双引号字符串和
new
字符串对象 - 字符串为什么是不可变的?
String
、StringBuilder
和StringBuffer
之间的区别- 字符串拼接的几种方式
- 字符串常量池
- 关于
intern
- 字符串比较(
==
和equals
) - 字符串拆分
- 字符串操作小技巧
- 字符串转整形
- 生成 UUID(多谢知友的提醒,链接已更新)
- 字符串可以引用传递吗?
- 字符串长度
- 关于
substring
03、第 13 -20 个小时,Java 核心技术
1)面向对象
- 面向对象和面向过程
- 封装
- 继承
- 多态
- 接口
- 抽象类
- 重写和重载
- 重载的 11 条规则
- 构造方法
- 局部变量、成员变量、静态变量、常量
- 值传递还是引用传递
final
关键字this
关键字super
关键字- 不可变对象
equals()
和hashCode()
- 打印 Java 对象
NullPointerException
2)常用工具类
- 字符串相关的工具类
- 日期时间相关的工具类
- 枚举
- 随机数
- 正则表达式
- Apache-commons 工具库
- Guava 工具库
- 日志组件(Log4j、SLF4J、Logback、Log4j 2)
- JSON 解析器(Jackson, fastjson, Gson)
- Hutool
3)集合框架
ArrayList
LinkedList
ArrayList
和LinkedList
之间的区别- 不可变
List
CopyOnWriteArrayList
HashMap
LinkedHashMap
TreeMap
ConcurrentHashMap
- fail-fast
4)反射机制
5)异常处理
- try-with-resource
6)注解
7)IO 流
- 字符流、字节流
- 输入流、输出流
- 同步、异步
- 阻塞、非阻塞
- BIO、NIO 和 AIO
- NIO 2.0
8)序列化
9)泛型
10)单元测试 JunitTestNG
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、第 21 -24 个小时,JVM 和性能优化
1)JVM
- Java 内存结构
- 堆
- 栈
- 垃圾回收
- JVM 内存区域
- Java 虚拟机栈
- class 文件
- 字节码指令
- JVM 参数调优
- Java 对象模型
- HotSpot
- 类加载机制
- 编译和反编译
- 反编译工具 (
javap
) - JIT
- 虚拟机性能监控和故障处理工具(
jps
、jstack
、jmap
、jstat
、jconsole
、javap
)
2)性能优化
- 使用单例
- 使用线程池
- 减少上下文切换
- 减小锁粒度
- 数据压缩
Stream
并行流- GC 调优
- JVM 内存分配调优
btrace
05、第 2 天,补充基础知识
1)设计模式
- 设计模式的六大原则
- 创建型设计模式(单例、抽象工厂、建造者、工厂、原型)
- 结构型设计模式(适配器、桥接、装饰、组合、外观、享元、代理)
- 行为型设计模式(模板方法、命令、迭代器、观察者、中介者、备忘录、解释器、状态、策略、责任链、访问者)
- 单例的七种写法
2)数据结构与算法
- 简单的数据结构(栈、队列、链表、数组、哈希表)
- 树(二叉树、字典树、平衡树、排序树、B 树、B+ 树、R 树、红黑树、多路树)
- 堆图(拓扑、有向图、无向图)
- 稳定的排序算法(冒泡排序、插入排序、鸡尾酒排序、桶排序、计数排序、归并排序、原地归并排序、二叉排序树排序、鸽巢排序、基数排序、侏儒排序、图书馆排序、块排序)
- 不稳定的排序算法(选择排序、希尔排序、梳排序、堆排序、平滑排序、快速排序、内省排序、耐心排序、Clover 排序)
- 时间复杂度
- 空间复杂度
- 贪心算法
- KMP 算法
3)操作系统
- Linux 常用命令(
find
、top
、tar
、move
、grep
、tail
、netstat
、curl
、wget
、ping
、ssh
) - 服务器性能指标(qps、CPU 利用率)
- 进程同步
- 分段和分页
- 虚拟内存和主存
4)网络安全
- CSRF
- XSS
- SQL 注入
- 加密和解密(对称加密、非对称加密)
- MD5、SHA1、DES、RSA
- DDOS 攻击
- HTTP 和 HTTPS
- SSL
- TLS
- TCP 和 UDP
- Cookie、Session
- CDN
- DNS
5)数据库
- MySql
- 索引
- 存储过程
- 分库分表
- binlog
- 读写分离
- 数据库缓存(Redis、MongoDB)
- 数据库中间件(MyCat)
- 数据库连接池(Durid)
6)大数据
- 搜索(Elasticsearch 、Solr)
- 流式计算(Storm、Spark、Flink)
- Hadoop
7)服务器
- Tomcat
- jetty
- Nginx
8)框架
- Spring
- MyBatis
- Spring MVC
- Spring Boot
- Spring Security
- Spring Cloud
- Netty
- Dubbo
9)消息队列
- RabbitMQ
- Kafka
10)容器
- Docker
- K8s
06、第 3 天 半天刷面试题和算法题 + 半天准备简历
Markjour.com 注释:跳过,一份 Java 面试攻略,一份 LeetCode 刷题笔记。