主要版本 | 更新時間 | 備註 |
---|---|---|
v3.0 | 2020-03-31 | 知識體系完善,在v2.0的基礎上,新增20%左右的知識點 調整部分知識的順序及結構,方便閱讀和理解 經過GitHub Page搭建,便於閱讀 |
v2.0 | 2019-02-19 | 結構調整,更適合從入門到精通; 進一步完善知識體系; 新技術補充; |
v1.1 | 2018-03-12 | 增長新技術知識、完善知識體系 |
v1.0 | 2015-08-01 | 首次發佈 |
GitHub 項目地址:進入java
GitHub Pages 完整閱讀:進入react
Gitee Pages 完整閱讀:進入 (國內訪問速度較快)nginx
面向對象與面向過程git
面向對象的三大基本特徵github
面向對象的五大基本原則web
什麼是多態正則表達式
方法重寫與重載redis
Java的繼承與實現算法
Java的繼承與組合spring
構造函數與默認構造函數
類變量、成員變量和局部變量
成員變量和方法做用域
Java如何實現的平臺無關性的
JVM還支持哪些語言
值傳遞、引用傳遞
爲何說Java中只有值傳遞
8種基本數據類型
整型中byte、short、int、long的取值範圍
什麼是浮點型?
什麼是單精度和雙精度?
爲何不能用浮點型表示金額?
自動拆裝箱
Integer的緩存機制
如何正肯定義接口的返回值(boolean/Boolean)類型及命名(success/Success)
字符串的不可變性
String的長度限制
JDK 6和JDK 7中substring的原理及區別
replaceFirst、replaceAll、replace區別
String、StringBuilder和StingBuffer之間的區別與聯繫
String對「+」的重載
字符串拼接的幾種方式和區別
String.valueOf和Integer.toString的區別
switch對String的支持
字符串池
常量池(運行時常量池、Class常量池)
intern
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對枚舉的支持
枚舉的序列化如何實現
枚舉的線程安全性問題
字符流、字節流
輸入流、輸出流
字節流和字符流之間的相互轉換
同步、異步
阻塞、非阻塞
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.*
apache-commons
google-guava
netty
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
UTF八、UTF1六、UTF32區別
有了UTF8爲何還須要GBK?
GBK、GB23十二、GB18030之間的區別
URL編解碼
Big Endian和Little Endian
如何解決亂碼問題
Java中語法糖原理、解語法糖
常見語法糖原理:switch 支持 String 與枚舉、泛型、自動裝箱與拆箱、方法變長參數、枚舉、內部類、條件編譯、 斷言、數值字面量、for-each、try-with-resource、Lambda表達式、本地變量類型推斷、record
什麼是Java消息服務
JMS消息傳送模型
java.lang.management.*
javax.management.*
lambda表達式
Stream API
時間API
String
Integer
Long
Enum
BigDecimal
ThreadLocal
ClassLoader & URLClassLoader
ArrayList & LinkedList
HashMap & LinkedHashMap & TreeMap & CouncurrentHashMap
HashSet & LinkedHashSet & TreeSet
什麼是併發
什麼是並行
併發與並行的區別
線程與進程的區別
線程的實現
線程的狀態
線程優先級
線程調度
多線程如何Debug
守護線程
繼承Thread類建立線程
實現Runnable接口建立線程
經過Callable和FutureTask建立線程
經過線程池建立線程
本身設計線程池
submit() 和 execute()
線程池原理
爲何不容許使用Executors建立線程池
什麼是線程安全
多級緩存和一致性問題
CPU時間片和原子性問題
指令重排和有序性問題
線程安全和內存模型的關係
happens-before
as-if-serial
可重入鎖
阻塞鎖
樂觀鎖與悲觀鎖
數據庫相關鎖機制
分佈式鎖
CAS
CAS的ABA問題
偏向鎖
輕量級鎖
重量級鎖
鎖消除
鎖粗化
自旋鎖
什麼是死鎖
死鎖的緣由
如何避免死鎖
寫一個死鎖的程序
死鎖問題如何排查
synchronized是如何實現的?
synchronized和lock之間關係
不使用synchronized如何實現一個線程安全的單例
synchronized和原子性
synchronized和可見性
synchronized和有序性
編譯器指令重排和CPU指令重排
volatile的實現原理
內存屏障
volatile和原子性
volatile和可見性
volatile和有序性
有了symchronized爲何還須要volatile
start & run
sleep & wait
notify & notifyAll
ThreadLocal 原理
ThreadLocal 底層的數據結構
同步容器與併發容器
Thread
Runnable
Callable
ReentrantLock
ReentrantReadWriteLock
Atomic*
Semaphore
CountDownLatch
ConcurrentHashMap
Executors
運行時數據區域
運行時數據區哪些是線程獨享
堆和棧區別
方法區在不一樣版本JDK中的位置
堆外內存
TLAB
Java中的對象必定在堆上分配嗎?
GC算法:標記清除、引用計數、複製、標記壓縮、分代回收、增量式回收
GC參數
對象存活的斷定
垃圾收集器(CMS、G一、ZGC、Epsilon)
-Xmx
-Xmn
-Xms
Xss
-XX:SurvivorRatio
-XX:PermSize
-XX:MaxPermSize
-XX:MaxTenuringThreshold
oop-klass
對象頭
即時編譯器
編譯優化
計算機內存模型
緩存一致性
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優化(逃逸分析、棧上分配、標量替換、鎖優化)
字節碼
class文件格式
CAFEBABE
用位運算實現加、減、乘、除、取餘
開閉原則
里氏代換原則
依賴倒轉原則
接口隔離原則
迪米特法則(最少知道原則)
合成複用原則
單例模式
抽象工廠模式
建造者模式
工廠模式
原型模式
適配器模式
橋接模式
裝飾模式
組合模式
外觀模式
享元模式
代理模式
模版方法模式
命令模式
迭代器模式
觀察者模式
中介者模式
備忘錄模式
解釋器模式
狀態模式
策略模式
責任鏈模式
訪問者模式
懶漢——線程不安全
懶漢——線程安全
餓漢
餓漢——變種
靜態內部類
枚舉
雙重校驗鎖
簡單工廠、工廠方法、模板工廠
適配器模式
策略模式
模板方法模式
觀察者模式
外觀模式
代理模式
tcp、udp、http、https
用Java實現FTP、SMTP協議
每一層的主要協議
三次握手與四次關閉
流量控制和擁塞控制
tcp粘包與拆包
IPV4
IPV6
http/1.0 http/1.1 http/2之間的區別
http和https的區別
http中 get和post區別
常見的web請求返回的狀態碼
40四、30二、30一、500分別表明什麼
用Java寫一個簡單的靜態文件的HTTP服務器
cookie被禁用,如何實現session
什麼是DNS
記錄類型:A記錄、CNAME記錄、AAAA記錄等
域名解析
根域名服務器
DNS污染
DNS劫持
公共DNS:114 DNS、Google DNS、OpenDNS
反向代理
正向代理
反向代理服務器
生命週期
線程安全問題
filter和listener
web.xml中經常使用配置及做用
什麼是OR Mapping
Hibernate的緩存機制
Hibernate的懶加載
Hibernate/Ibatis/MyBatis之間的區別
Mybatis緩存機制
#{}
和${}
的區別
mapper中傳遞多個參數
Mybatis動態sql
Mybatis的延遲加載
Bean的初始化
AOP原理
實現Spring的IOC
spring四種依賴注入方式
什麼是MVC
Spring mvc與Struts mvc的區別
Spring Boot 2.0
起步依賴
自動配置
Spring Boot的starter原理
本身實現一個starter
爲何Spring Boot能夠經過main啓動web項目
服務發現與註冊:Eureka、Zookeeper、Consul
負載均衡:Feign、Spring Cloud Loadbalance
服務配置:Spring Cloud Config
服務限流與熔斷:Hystrix
服務鏈路追蹤:Dapper
服務網關、安全、消息
JBoss
tomcat
jetty
Weblogic
git & svn
maven & gradle
分支合併
衝突解決
提交回滾
依賴樹
依賴仲裁
經常使用插件:Maven Helper、FindBugs-IDEA、阿里巴巴代碼規約檢測、GsonFormat、Lombok plugin、.ignore、Mybatis plugin
Jigsaw
Jshell
Reactive Streams
局部變量類型推斷
G1的並行Full GC
ThreadLocal握手機制
ZGC
Epsilon
加強var
Switch 表達式
Text Blocks
Dynamic CDS Archives
Java打包工具
更有價值的NullPointerException
record類型
響應式編程
使用單例
使用Future模式
使用線程池
選擇就緒
減小上下文切換
減小鎖粒度
數據壓縮
結果緩存
Stream並行流
GC調優
JVM內存分配調優
SQL調優
線程Dump
內存Dump
gc狀況
jstack
jstat
jmap
jhat
Arthas
HeapOutOfMemory
Young OutOfMemory
MethodArea OutOfMemory
ConstantPool OutOfMemory
DirectMemory OutOfMemory
Stack OutOfMemory Stack OverFlow
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代碼的編譯與反編譯
javap
jad
CRF
編譯器優化
find、grep、ps、cp、move、tar、head、tail、netstat、lsof、tree、wget、curl、ping、ssh、echo、free、top
load
CPU利用率
內存使用狀況
qps
rt
生產者消費者問題
哲學家就餐問題
讀者寫者問題
如何查看執行計劃
如何根據執行計劃進行SQL優化
Hash索引&B樹索引
普通索引&惟一索引
彙集索引&非彙集索引
覆蓋索引
最左前綴原則
索引下推
索引失效
事務的ACID
事務的隔離級別與讀現象
事務能不能實現鎖的功能
utf8
utf8mb4
爲何不要在數據庫中使用utf8編碼
count(1)、count(*)、count(字段)的區別
爲何建議使用count(*)
共享鎖、排它鎖
行鎖、表鎖
樂觀鎖、悲觀鎖
使用數據庫鎖實現樂觀鎖
Gap Lock、Next-Key Lock
內鏈接
左鏈接
右鏈接
binlog
redolog
h2
redis
memcached
棧
隊列
鏈表
數組
哈希表
棧和隊列的相同和不一樣之處
棧一般採用的兩種存儲結構
兩個棧實現隊列,和兩個隊列實現棧
二叉樹
字典樹
平衡樹
排序樹
B樹
B+樹
R樹
多路樹
紅黑樹
大根堆
小根堆
有向圖
無向圖
拓撲
冒泡排序
插入排序
雞尾酒排序
桶排序
計數排序
歸併排序
原地歸併排序
二叉排序樹排序
鴿巢排序
基數排序
侏儒排序
圖書館排序
塊排序
選擇排序
希爾排序
Clover排序算法
梳排序
堆排序
平滑排序
快速排序
內省排序
耐心排序
如何計算時間複雜度和空間複雜度
經常使用排序算法的時間複雜度
分治
hash映射
堆排序
雙層桶劃分
Bloom Filter
bitmap
數據庫索引
mapreduce等
Solr
Lucene
ElasticSearch
Storm
Spark
Flink
HDFS
MapReduce
flume
kafka
logstash
mahout
XSS的防護
SQL注入
XML注入
CRLF注入
對稱加密
非對稱加密
哈希算法
加鹽哈希算法
MD5
SHA1
DES
AES
RSA
DSA
DOS攻擊
DDOS攻擊
memcached爲何能夠致使DDos攻擊
什麼是反射型DDoS
如何經過Hash碰撞進行DOS攻擊
單一職責原則
開放封閉原則
里氏替代原則
依賴倒置原則
接口分離原則
分佈式與集羣
數據一致性
服務治理
服務降級
2PC
3PC
CAP
BASE
基本概念
常見用法
ZAB算法
腦裂
本地事務&分佈式事務
可靠消息最終一致性
最大努力通知
TCC
服務註冊
服務發現
服務治理
怎樣打造一個分佈式數據庫
何時須要分佈式數據庫
mycat
otter
HBase
mfs
fastdfs
緩存一致性
緩存命中率
緩存冗餘
熔斷器模式
Hystrix
Sentinal
resilience4j
拜占庭問題與算法
2PC
3PC
共識算法
Paxos 算法與 Raft 算法
ZAB算法
實體、值對象
聚合、聚合根
限界上下文
DDD如何分層
充血模型和貧血模型
DDD和微服務有什麼關係
SOA
康威定律
sidecar
橫向拆分與水平拆分
分庫分表後的分佈式事務問題
RabbitMQ、RocketMQ、ActiveMQ、Kafka
各個消息隊列的對比
主備複製
主從複製
主主複製
讀寫分離
分庫分表
緩存穿透
緩存雪崩
緩存熱點
CPU
內存
磁盤I/O
網絡I/O等
進程監控
語義監控
機器資源監控
數據波動
日誌
埋點
Dapper
二層負載均衡
三層負載均衡
四層負載均衡
七層負載均衡
LVS
Nginx
HAProxy
靜態負載均衡算法:輪詢,比率,優先權
動態負載均衡算法: 最少鏈接數,最快響應速度,觀察方法,預測法,動態性能分配,動態服務器補充,服務質量,服務類型,規則模式。
DNS原理
DNS的設計
數據一致性
IaaS
SaaS
PaaS
虛擬化技術
openstack
Serverlsess
Solr
Lucene
Nutch
Elasticsearch
Shiro
哈希算法
Merkle樹
公鑰密碼算法
共識算法
Raft協議
Paxos 算法與 Raft 算法
拜占庭問題與算法
消息認證碼與數字簽名
挖礦
共識機制
閃電網絡
側鏈
熱點問題
分叉
超級帳本
數學基礎
機器學習
人工神經網絡
深度學習
應用場景
TensorFlow
DeepLearning4J
Groovy
Kotlin
Python
Go
NodeJs
Swift
Rust