准备了大半年时间,一直坚持手敲的方式记录学习的每一过程,今天终于同大家见面了。此篇博客旨在引发java学习的思考,如果有对java学习迷茫的小伙伴,可以看过来,给大家提供一个清晰的思路,不至于越走越远,供大家学习交流。
这里将开启你的人生新天地,不只技术分享,更多对人生的感悟和实践,站在作者肩膀上猪也能起风!
如果你是技术人员,可以关注公众号Java云上体验,回复:面试题,不定期更新资料,留言备注java,进java技术交流内推群。
如果你是渴望提升自己,成为更好的自己,购物省钱或者偶尔能赚点零花钱,公众号留言备注freemoney,进群交流。
我一直认为读一本书的顺序都是先看目录,大纲,然后再细品,只有这样才是高效地读书。往往囫囵吞枣式的看书效果恨不明显,最好的方式是带着问题,带着疑问去读,去学,成长。
以下便是java学习路线的一个小结,学习是一个长期的过程,每天进步一天,每天成功一点,你便离成功更近一步。
有一句话,我觉得说的挺好的,“你的对手在看书,你的仇人在磨刀,你的闺蜜在减肥,隔壁老王在练腰”。
## 1.基础篇
### 1.1面向对象
**什么是面向对象**
面向对象与面向过程
面向对象的三大基本特征
面向对象的五大基本原则
**封装、继承、多态**
什么是多态
方法重写与重载
Java的继承与实现
Java的继承与组合
构造函数与默认构造函数
类变量、成员变量和局部变量
成员变量和方法作用域
**平台无关性**
Java如何实现的平台无关性的
JVM还支持哪些语言
**值传递**
值传递、引用传递
为什么说Java中只有值传递
### 1.2Java基础知识
**基本数据类型**
8种基本数据类型
整型中byte、short、int、long的取值范围
什么是浮点型?
什么是单精度和双精度?
为什么不能用浮点型表示金额?
**自动拆装箱**
自动拆装箱
Integer的缓存机制
如何正确定义接口的返回值(boolean/Boolean)类型及命名(success/Success)
**String**
字符串的不可变性
String的长度限制
JDK 6和JDK 7中substring的原理及区别
replaceFirst、replaceAll、replace区别
String、StringBuilder和StingBuffer之间的区别与联系
String对“+”的重载
字符串拼接的几种方式和区别
String.valueOf和Integer.toString的区别
switch对String的支持
字符串池
常量池(运行时常量池、Class常量池)
intern
**Java中各种关键字**
transient
instanceof
volatile
synchronized
final
static
const
**集合类**
Collection和Collections的区别
常用集合类的使用
Set和List区别
ArrayList和LinkedList和Vector的区别
SynchronizedList和Vector的区别
Set如何保证元素不重复
HashMap、HashTable、ConcurrentHashMap区别
Java 8中Map相关的红黑树的引用背景、原理等
HashMap的容量、扩容、hash等原理
Java 8中stream相关用法
Apache集合处理工具类的使用
不同版本的JDK中HashMap的实现的区别以及原因
Arrays.asList获得的List使用时需要注意什么
Collection如何迭代
Enumeration和Iterator区别
如何在遍历的同时删除ArrayList中的元素
fail-fast 和 fail-safe
CopyOnWriteArrayList
ConcurrentSkipListMap
**枚举**
枚举的用法
枚举的实现
枚举与单例
Enum类
Java枚举如何比较
switch对枚举的支持
枚举的序列化如何实现
枚举的线程安全性问题
**IO**
字符流、字节流
输入流、输出流
字节流和字符流之间的相互转换
同步、异步
阻塞、非阻塞
Linux 5种IO模型
BIO、NIO和AIO的区别
三种IO的用法与原理
netty
**反射**
什么是反射
反射有什么作用
Class类
java.lang.reflect.*
**动态代理**
静态代理
动态代理
动态代理和反射的关系
动态代理的几种实现方式
AOP
**序列化**
什么是序列化与反序列化
Java如何实现序列化与反序列化
Serializable 和 Externalizable 有何不同
为什么需要序列化
serialVersionUID
为什么serialVersionUID不能随便改
transient
序列化底层原理
序列化如何破坏单例模式
protobuf
为什么说序列化并不安全
**注解**
元注解
自定义注解
Java中常用注解使用
注解与反射的结合
如何自定义一个注解?
Spring常用注解
**泛型**
什么是泛型
类型擦除
泛型带来的问题
泛型中K T V E ?object等的含义
泛型各种用法
限定通配符和非限定通配符
上下界限定符extends 和 super
List和原始类型List之间的区别?
List和List之间的区别是什么?
**单元测试**
junit
junit和Spring的结合
mock
mockito
内存数据库(h2)
**正则表达式**
java.lang.util.regex.*
**常用的Java工具库**
apache-commons
google-guava
netty
**API&SPI**
API
API和SPI的关系和区别
如何定义SPI
SPI的实现原理
**异常**
Error和Exception
异常类型
异常相关关键字
正确处理异常
自定义异常
异常链
try-with-resources
finally和return的执行顺序
**时间处理**
时区
冬令时和夏令时
时间戳
Java中时间API(Java 8)
格林威治时间
CET、UTC、GMT、CST几种常见时间的含义和关系
SimpleDateFormat的线程安全性问题
Java 8中的时间处理
如何在东八区的计算机上获取美国时间
yyyy和YYYY有什么区别?
**编码方式**
什么是ASCII?
Unicode
有了Unicode为啥还需要UTF-8
UTF8、UTF16、UTF32区别
有了UTF8为什么还需要GBK?
GBK、GB2312、GB18030之间的区别
URL编解码
Big Endian和Little Endian
如何解决乱码问题
**语法糖**
Java中语法糖原理、解语法糖
常见语法糖原理:switch 支持 String 与枚举、泛型、自动装箱与拆箱、方法变长参数、枚举、内部类、条件编译、 断言、数值字面量、for-each、try-with-resource、Lambda表达式、本地变量类型推断、record
**JMS**
什么是Java消息服务
JMS消息传送模型
**JMX**
java.lang.management.*
javax.management.*
**Java 8**
lambda表达式
Stream API
时间API
**阅读源代码**
String
Integer
Long
Enum
BigDecimal
ThreadLocal
ClassLoader & URLClassLoader
ArrayList & LinkedList
HashMap & LinkedHashMap & TreeMap & CouncurrentHashMap
HashSet & LinkedHashSet & TreeSet
### 1.3Java并发编程
**并发与并行**
什么是并发
什么是并行
并发与并行的区别
**线程**
线程与进程的区别
线程的实现
线程的状态
线程优先级
线程调度
多线程如何Debug
守护线程
**创建线程的多种方式**
继承Thread类创建线程
实现Runnable接口创建线程
通过Callable和FutureTask创建线程
通过线程池创建线程
**线程池**
自己设计线程池
submit() 和 execute()
线程池原理
为什么不允许使用Executors创建线程池
**线程安全**
什么是线程安全
多级缓存和一致性问题
CPU时间片和原子性问题
指令重排和有序性问题
线程安全和内存模型的关系
happens-before
as-if-serial
**锁**
可重入锁
阻塞锁
乐观锁与悲观锁
数据库相关锁机制
分布式锁
**无锁**
CAS
CAS的ABA问题
**锁优化**
偏向锁
轻量级锁
重量级锁
锁消除
锁粗化
自旋锁
**死锁**
什么是死锁
死锁的原因
如何避免死锁
写一个死锁的程序
死锁问题如何排查
**synchronized**
synchronized是如何实现的?
synchronized和lock之间关系
不使用synchronized如何实现一个线程安全的单例
synchronized和原子性
synchronized和可见性
synchronized和有序性
**volatile**
编译器指令重排和CPU指令重排
volatile的实现原理
内存屏障
volatile和原子性
volatile和可见性
volatile和有序性
有了symchronized为什么还需要volatile
**线程相关方法**
start & run
sleep & wait
notify & notifyAll
ThreadLocal
ThreadLocal 原理
ThreadLocal 底层的数据结构
写代码解决生产者消费者问题
**并发包**
同步容器与并发容器
Thread
Runnable
Callable
ReentrantLock
ReentrantReadWriteLock
Atomic*
Semaphore
CountDownLatch
ConcurrentHashMap
Executors
### 1.4JVM
**JVM内存结构**
运行时数据区域
运行时数据区哪些是线程独享
堆和栈区别
方法区在不同版本JDK中的位置
堆外内存
TLAB
Java中的对象一定在堆上分配吗?
**垃圾回收**
GC算法:标记清除、引用计数、复制、标记压缩、分代回收、增量式回收
GC参数
对象存活的判定
垃圾收集器(CMS、G1、ZGC、Epsilon)
**JVM参数及调优**
-Xmx
-Xmn
-Xms
-Xss
-XX:SurvivorRatio
-XX:PermSize
-XX:MaxPermSize
-XX:MaxTenuringThreshold
**Java对象模型**
oop-klass
对象头
HotSpot
即时编译器
编译优化
Java内存模型
计算机内存模型
缓存一致性
MESI协议
可见性
原子性
顺序性
happens-before
as-if-serial
内存屏障
synchronized
volatile
final
锁
**虚拟机性能监控与故障处理工具**
jps
jstack
jmap
jstat
jconsole
jinfo
jhat
javap
btrace
TProfiler
Arthas
**类加载机制**
classLoader
类加载过程是线程安全的吗?
类加载过程
双亲委派(破坏双亲委派)
模块化(jboss modules、osgi、jigsaw)
**打包工具**
jar、jlink、jpackage
**编译与反编译**
什么是编译
什么是反编译
编译工具:javac
反编译工具:javap 、jad 、CRF
**JIT**
JIT优化(逃逸分析、栈上分配、标量替换、锁优化)
## 2.进阶
### 2.1Java底层知识
字节码
class文件格式
CAFEBABE
**位运算**
用位运算实现加、减、乘、除、取余
### 2.2设计模式
**设计模式的六大原则**
开闭原则
里氏代换原则
依赖倒转原则
接口隔离原则
迪米特法则(最少知道原则)
合成复用原则
**创建型设计模式**
单例模式
抽象工厂模式
建造者模式
工厂模式
原型模式
**结构型设计模式**
适配器模式
桥接模式
装饰模式
组合模式
外观模式
享元模式
代理模式
**行为型设计模式**
模版方法模式
命令模式
迭代器模式
观察者模式
中介者模式
备忘录模式
解释器模式
状态模式
策略模式
责任链模式
访问者模式
**单例的七种写法**
懒汉——线程不安全
懒汉——线程安全
饿汉
饿汉——变种
静态内部类
枚举
双重校验锁
**为什么推荐使用枚举实现单例?**
**三种工厂模式的区别及联系**
**简单工厂、工厂方法、模板工厂**
**会使用常用设计模式**
适配器模式
策略模式
模板方法模式
观察者模式
外观模式
代理模式
**不用synchronized和lock,实现线程安全的单例模式**
**nio和reactor设计模式**
**Spring中用到了哪些设计模式**
### 2.3网络编程知识
**常用协议**
tcp、udp、http、https
用Java实现FTP、SMTP协议
**OSI七层模型**
每一层的主要协议
**TCP、UDP**
三次握手与四次关闭
流量控制和拥塞控制
tcp粘包与拆包
**TCP/IP**
IPV4
IPV6
**HTTP**
http/1.0 http/1.1 http/2之间的区别
http和https的区别
http中 get和post区别
常见的web请求返回的状态码
404、302、301、500分别代表什么
用Java写一个简单的静态文件的HTTP服务器
**http/2**
Java RMI,Socket,HttpClient
cookie 与 session
cookie被禁用,如何实现session
了解nginx和apache服务器的特性并搭建一个对应的服务器
**进程间通讯的方式**
**什么是CDN?如果实现?**
**DNS**
什么是DNS
记录类型:A记录、CNAME记录、AAAA记录等
域名解析
根域名服务器
DNS污染
DNS劫持
公共DNS:114 DNS、Google DNS、OpenDNS
**代理**
反向代理
正向代理
反向代理服务器
### 2.4框架知识
**Servlet**
生命周期
线程安全问题
filter和listener
web.xml中常用配置及作用
**Hibernate**
什么是OR Mapping
Hibernate的缓存机制
Hibernate的懒加载
Hibernate/Ibatis/MyBatis之间的区别
**MyBatis**
Mybatis缓存机制
#{}和${}的区别
mapper中传递多个参数
Mybatis动态sql
Mybatis的延迟加载
**Spring**
Bean的初始化
AOP原理
实现Spring的IOC
spring四种依赖注入方式
**Spring MVC**
什么是MVC
Spring mvc与Struts mvc的区别
**Spring Boot**
Spring Boot 2.0
起步依赖
自动配置
Spring Boot的starter原理
自己实现一个starter
为什么Spring Boot可以通过main启动web项目
**Spring Security**
**Spring Cloud**
服务发现与注册:Eureka、Zookeeper、Consul
负载均衡:Feign、Spring Cloud Loadbalance
服务配置:Spring Cloud Config
服务限流与熔断:Hystrix
服务链路追踪:Dapper
服务网关、安全、消息
**Intellij IDEA**
常用插件:Maven Helper、FindBugs-IDEA、阿里巴巴代码规约检测、GsonFormat、Lombok plugin、.ignore、Mybatis plugin
## 3.高级篇
### 3.1新技术
**Java 9**
Jigsaw
Jshell
Reactive Streams
**Java 10**
局部变量类型推断
G1的并行Full GC
ThreadLocal握手机制
**Java 11**
ZGC
Epsilon
增强var
**Java 12**
Switch 表达式
**Java 13**
Text Blocks
Dynamic CDS Archives
**Java 14**
Java打包工具
更有价值的NullPointerException
record类型
**Spring 5**
响应式编程
**Spring Boot 2.0**
**http/2**
**http/3**
### 3.2性能优化
使用单例
使用Future模式
使用线程池
选择就绪
减少上下文切换
减少锁粒度
数据压缩
结果缓存
Stream并行流
GC调优
JVM内存分配调优
SQL调优
### 3.3常见问题解决思路
内存溢出
线程死锁
类加载冲突
load飙高
CPU利用率飙高
慢SQL
### 3.4操作系统知识
**Linux的常用命令**
find、grep、ps、cp、move、tar、head、tail、netstat、lsof、tree、wget、curl、ping、ssh、echo、free、top
**进程间通信**
**服务器性能指标**
load
CPU利用率
内存使用情况
qps
rt
**进程同步**
生产者消费者问题
哲学家就餐问题
读者写者问题
缓冲区溢出
**分段和分页**
虚拟内存与主存
虚拟内存管理
换页算法
### 3.5数据库知识
**MySql 执行引擎**
**MySQL 执行计划**
如何查看执行计划
如何根据执行计划进行SQL优化
**索引**
Hash索引&B树索引
普通索引&唯一索引
聚集索引&非聚集索引
覆盖索引
最左前缀原则
索引下推
索引失效
**回表**
**SQL优化**
**数据库事务和隔离级别**
事务的ACID
事务的隔离级别与读现象
事务能不能实现锁的功能
**编码方式**
utf8
utf8mb4
**为什么不要在数据库中使用utf8编码**
**行数统计**
count(1)、count(*)、count(字段)的区别
为什么建议使用count(*)
**数据库锁**
共享锁、排它锁
行锁、表锁
乐观锁、悲观锁
使用数据库锁实现乐观锁
Gap Lock、Next-Key Lock
**连接**
内连接
左连接
右连接
**数据库主备搭建**
**log**
binlog
redolog
**内存数据库**
h2
**分库分表**
**读写分离**
**常用的nosql数据库**
redis
memcached
**分别使用数据库锁、NoSql实现分布式锁**
**性能调优**
**数据库连接池**
### 3.6数据结构与算法知识
**简单的数据结构**
栈
队列
链表
数组
哈希表
栈和队列的相同和不同之处
栈通常采用的两种存储结构
两个栈实现队列,和两个队列实现栈
**树**
二叉树
字典树
平衡树
排序树
B树
B+树
R树
多路树
红黑树
**堆**
大根堆
小根堆
**图**
有向图
无向图
拓扑
**稳定的排序算法**
冒泡排序
插入排序
鸡尾酒排序
桶排序
计数排序
归并排序
原地归并排序
二叉排序树排序
鸽巢排序
基数排序
侏儒排序
图书馆排序
块排序
**不稳定的排序算法**
选择排序
希尔排序
Clover排序算法
梳排序
堆排序
平滑排序
快速排序
内省排序
耐心排序
**时间复杂度&空间复杂度**
**如何计算时间复杂度和空间复杂度**
**常用排序算法的时间复杂度**
**深度优先和广度优先搜索**
**全排列**
**贪心算法**
**KMP算法**
**hash算法**
**海量数据处理**
分治
hash映射
堆排序
双层桶划分
Bloom Filter
bitmap
数据库索引
mapreduce等
## 4.架构篇
### 4.1分布式
分布式与集群
数据一致性
服务治理
服务降级
**分布式理论**
2PC
3PC
CAP
BASE
**分布式协调 Zookeeper**
基本概念
常见用法
ZAB算法
脑裂
**分布式事务**
本地事务&分布式事务
可靠消息最终一致性
最大努力通知
TCC
**Dubbo**
服务注册
服务发现
服务治理
**分布式数据库**
怎样打造一个分布式数据库
什么时候需要分布式数据库
mycat
otter
HBase
**分布式文件系统**
mfs
fastdfs
**分布式缓存**
缓存一致性
缓存命中率
缓存冗余
**限流降级**
熔断器模式
Hystrix
Sentinal
resilience4j
**分布式算法**
拜占庭问题与算法
2PC
3PC
共识算法
Paxos 算法与 Raft 算法
ZAB算法
### 4.2微服务
SOA
康威定律
ServiceMesh
sidecar
Docker & Kubernets
Spring Boot
Spring Cloud
### 4.3高并发
**分库分表**
横向拆分与水平拆分
分库分表后的分布式事务问题
**CDN技术**
**消息队列**
RabbitMQ、RocketMQ、ActiveMQ、Kafka
各个消息队列的对比
### 4.4高可用
**双机架构**
主备复制
主从复制
主主复制
异地多活
### 4.5高性能
**高性能数据库**
读写分离
分库分表
**高性能缓存**
缓存穿透
缓存雪崩
缓存热点
**负载均衡**
**PPC、TPC**
### 4.6监控
**监控什么**
CPU
内存
磁盘I/O
网络I/O等
**监控手段**
进程监控
语义监控
机器资源监控
数据波动
**监控数据采集**
日志
埋点
Dapper
### 4.7负载均衡
**负载均衡分类**
二层负载均衡
三层负载均衡
四层负载均衡
七层负载均衡
**负载均衡工具**
LVS
Nginx
HAProxy
**负载均衡算法**
静态负载均衡算法:轮询,比率,优先权
动态负载均衡算法: 最少连接数,最快响应速度,观察方法,预测法,动态性能分配,动态服务器补充,服务质量,服务类型,规则模式。
## 5.扩展篇
**云计算**
IaaS
SaaS
PaaS
**虚拟化技术**
**openstack**
**Serverlsess**
**搜索引擎**
Solr
Lucene
Nutch
Elasticsearch