基礎篇
面向對象
什麼是面向對象
面向對象與面向過程
面向對象的三大基本特徵
面向對象的五大基本原則
封裝、繼承、多態
什麼是多態
方法重寫與重載
Java的繼承與實現
Java的繼承與組合
構造函數與默認構造函數
類變量、成員變量和局部變量
成員變量和方法作用域
平臺無關性
Java如何實現的平臺無關性的
JVM還支持哪些語言
值傳遞
值傳遞、引用傳遞
為什麼說Java中只有值傳遞
Java基礎知識
基本數據類型
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
Java併發編程
併發與並行
什麼是併發
什麼是並行
併發與並行的區別
線程
線程與進程的區別
線程的實現
線程的狀態
線程優先級
線程調度
多線程如何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
Java成神之路對應的學習資料在文末會有對應學習答案,感興趣的可以獲取一份
轉發+轉發+轉發後關注我私信回覆【架構書籍】即可免費領取
底層篇
JVM
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優化(逃逸分析、棧上分配、標量替換、鎖優化)
進階篇
Java底層知識
字節碼
class文件格式
CAFEBABE
位運算
用位運算實現加、減、乘、除、取餘
設計模式
設計模式的六大原則
開閉原則
里氏代換原則
依賴倒轉原則
接口隔離原則
迪米特法則(最少知道原則)
合成複用原則
創建型設計模式
單例模式
抽象工廠模式
建造者模式
工廠模式
原型模式
結構型設計模式
適配器模式
橋接模式
裝飾模式
組合模式
外觀模式
享元模式
代理模式
行為型設計模式
模版方法模式
命令模式
迭代器模式
觀察者模式
中介者模式
備忘錄模式
解釋器模式
狀態模式
策略模式
責任鏈模式
訪問者模式
單例的七種寫法
懶漢——線程不安全
懶漢——線程安全
餓漢
餓漢——變種
靜態內部類
枚舉
雙重校驗鎖
為什麼推薦使用枚舉實現單例?
三種工廠模式的區別及聯繫
簡單工廠、工廠方法、模板工廠
會使用常用設計模式
適配器模式
策略模式
模板方法模式
觀察者模式
外觀模式
代理模式
不用synchronized和lock,實現線程安全的單例模式
nio和reactor設計模式
Spring中用到了哪些設計模式
網絡編程知識
常用協議
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
代理
反向代理
正向代理
反向代理服務器
框架知識
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
服務網關、安全、消息
應用服務器知識
JBoss
tomcat
jetty
Weblogic
工具
git & svn
maven & gradle
git技巧
分支合併
衝突解決
提交回滾
maven技巧
依賴樹
依賴仲裁
Intellij IDEA
常用插件:Maven Helper、FindBugs-IDEA、阿里巴巴代碼規約檢測、GsonFormat、Lombok plugin、.ignore、Mybatis plugin
高級篇
新技術
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
性能優化
使用單例
使用Future模式
使用線程池
選擇就緒
減少上下文切換
減少鎖粒度
數據壓縮
結果緩存
Stream並行流
GC調優
JVM內存分配調優
SQL調優
線上問題分析
dump
線程Dump
內存Dump
gc情況
dump分析
dump分析及獲取工具
jstack
jstat
jmap
jhat
Arthas
dump分析死鎖
dump分析內存洩露
自己編寫各種outofmemory,stackoverflow程序
HeapOutOfMemory
Young OutOfMemory
MethodArea OutOfMemory
ConstantPool OutOfMemory
DirectMemory OutOfMemory
Stack OutOfMemory Stack OverFlow
Arthas
jvm相關
class/classloader相關
monitor/watch/trace相關
options
管道
後臺異步任務
常見問題解決思路
內存溢出
線程死鎖
類加載衝突
load飆高
CPU利用率飆高
慢SQL
使用工具嘗試解決以下問題,並寫下總結
當一個Java程序響應很慢時如何查找問題
當一個Java程序頻繁FullGC時如何解決問題
如何查看垃圾回收日誌
當一個Java應用發生OutOfMemory時該如何解決
如何判斷是否出現死鎖
如何判斷是否存在內存洩露
使用Arthas快速排查Spring Boot應用404/401問題
使用Arthas排查線上應用日誌打滿問題
利用Arthas排查Spring Boot應用NoSuchMethodError
編譯原理知識
編譯與反編譯
Java代碼的編譯與反編譯
Java的反編譯工具
javap
jad
CRF
即時編譯器
編譯器優化
操作系統知識
Linux的常用命令
find、grep、ps、cp、move、tar、head、tail、netstat、lsof、tree、wget、curl、ping、ssh、echo、free、top
進程間通信
服務器性能指標
load
CPU利用率
內存使用情況
qps
rt
進程同步
生產者消費者問題
哲學家就餐問題
讀者寫者問題
緩衝區溢出
分段和分頁
虛擬內存與主存
虛擬內存管理
換頁算法
數據庫知識
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實現分佈式鎖
性能調優
數據庫連接池
數據結構與算法知識
簡單的數據結構
棧
隊列
鏈表
數組
哈希表
棧和隊列的相同和不同之處
棧通常採用的兩種存儲結構
兩個棧實現隊列,和兩個隊列實現棧
樹
二叉樹
字典樹
平衡樹
排序樹
B樹
B+樹
R樹
多路樹
紅黑樹
堆
大根堆
小根堆
圖
有向圖
無向圖
拓撲
穩定的排序算法
冒泡排序
插入排序
雞尾酒排序
桶排序
計數排序
歸併排序
原地歸併排序
二叉排序樹排序
鴿巢排序
基數排序
侏儒排序
圖書館排序
塊排序
不穩定的排序算法
選擇排序
希爾排序
Clover排序算法
梳排序
堆排序
平滑排序
快速排序
內省排序
耐心排序
時間複雜度&空間複雜度
如何計算時間複雜度和空間複雜度
常用排序算法的時間複雜度
深度優先和廣度優先搜索
全排列
貪心算法
KMP算法
hash算法
海量數據處理
分治
hash映射
堆排序
雙層桶劃分
Bloom Filter
bitmap
數據庫索引
mapreduce等
大數據知識
搜索
Solr
Lucene
ElasticSearch
流式計算
Storm
Spark
Flink
Hadoop,離線計算
HDFS
MapReduce
分佈式日誌收集
flume
kafka
logstash
數據挖掘
mahout
網絡安全知識
XSS
XSS的防禦
CSRF
注入攻擊
SQL注入
XML注入
CRLF注入
文件上傳漏洞
加密與解密
對稱加密
非對稱加密
哈希算法
加鹽哈希算法
加密算法
MD5
SHA1
DES
AES
RSA
DSA
彩虹表
DDOS攻擊
DOS攻擊
DDOS攻擊
memcahed為什麼可以導致DDos攻擊
什麼是反射型DDoS
如何通過Hash碰撞進行DOS攻擊
SSL、TLS,HTTPS
脫庫、洗庫、撞庫
架構篇
分佈式
分佈式與集群
數據一致性
服務治理
服務降級
分佈式理論
2PC
3PC
CAP
BASE
分佈式協調 Zookeeper
基本概念
常見用法
ZAB算法
腦裂
分佈式事務
本地事務&分佈式事務
可靠消息最終一致性
最大努力通知
TCC
Dubbo
服務註冊
服務發現
服務治理
分佈式數據庫
怎樣打造一個分佈式數據庫
什麼時候需要分佈式數據庫
mycat
otter
HBase
分佈式文件系統
mfs
fastdfs
分佈式緩存
緩存一致性
緩存命中率
緩存冗餘
限流降級
熔斷器模式
Hystrix
Sentinal
resilience4j
分佈式算法
拜占庭問題與算法
2PC
3PC
共識算法
Paxos 算法與 Raft 算法
ZAB算法
領域驅動設計
實體、值對象
聚合、聚合根
限界上下文
DDD如何分層
充血模型和貧血模型
DDD和微服務有什麼關係
微服務
SOA
康威定律
ServiceMesh
sidecar
Docker & Kubernets
Spring Boot
Spring Cloud
高併發
分庫分表
橫向拆分與水平拆分
分庫分表後的分佈式事務問題
CDN技術
消息隊列
RabbitMQ、RocketMQ、ActiveMQ、Kafka
各個消息隊列的對比
高可用
雙機架構
主備複製
主從複製
主主複製
異地多活
高性能
高性能數據庫
讀寫分離
分庫分表
高性能緩存
緩存穿透
緩存雪崩
緩存熱點
負載均衡
PPC、TPC
監控
監控什麼
CPU
內存
磁盤I/O
網絡I/O等
監控手段
進程監控
語義監控
機器資源監控
數據波動
監控數據採集
日誌
埋點
Dapper
負載均衡
負載均衡分類
二層負載均衡
三層負載均衡
四層負載均衡
七層負載均衡
負載均衡工具
LVS
Nginx
HAProxy
負載均衡算法
靜態負載均衡算法:輪詢,比率,優先權
動態負載均衡算法: 最少連接數,最快響應速度,觀察方法,預測法,動態性能分配,動態服務器補充,服務質量,服務類型,規則模式。
DNS
DNS原理
DNS的設計
CDN
數據一致性
Java成神之路學習文檔
全網最全Java核心知識體系
Java學習書籍文檔
Java成神之路學習資料領取方式
轉發+轉發+轉發後關注我私信回覆【架構書籍】即可免費領取
擴展篇
雲計算
IaaS
SaaS
PaaS
虛擬化技術
openstack
Serverlsess
搜索引擎
Solr
Lucene
Nutch
Elasticsearch
權限管理
Shiro
區塊鏈?
哈希算法
Merkle樹
公鑰密碼算法
共識算法
Raft協議
Paxos 算法與 Raft 算法
拜占庭問題與算法
消息認證碼與數字簽名
比特幣
挖礦
共識機制
閃電網絡
側鏈
熱點問題
分叉
以太坊
超級賬本
人工智能
數學基礎
機器學習
人工神經網絡
深度學習
應用場景
常用框架
TensorFlow
DeepLearning4J
IoT
量子計算
AR & VR
其他語言
Groovy
Kotlin
Python
Go
NodeJs
Swift
Rust
以上,就是Java工程師成神之路2020版的全部內容了,目前已經開始針對這裡面的內容進行分章節講解,在GitHub中同步更新中,並且提供了免費的在線閱讀地址。
微服務體系架構視頻
Java成神之路學習資料領取方式
轉發+轉發+轉發後關注我私信回覆【架構書籍】即可免費領取
閱讀更多 java互聯網架構 的文章