來自:Hollis(微訊號:hollischuang)
主要版本 |
更新時間 |
備註 |
v1.0 |
2015-08-01 |
首次釋出 |
v1.1 |
2018-03-12 |
增加新技術知識、完善知識體系 |
v2.0 |
2019-02-19 |
結構調整,更適合從入門到精通;進一步完善知識體系; 新技術補充; |
1 基礎篇
面向物件
→ 什麼是面向物件
面向物件、面向過程
面向物件的三大基本特徵和五大基本原則
→ 平臺無關性
Java 如何實現的平臺無關
JVM 還支援哪些語言(Kotlin、Groovy、JRuby、Jython、Scala)
→ 值傳遞
值傳遞、取用傳遞
為什麼說 Java 中只有值傳遞
→ 封裝、繼承、多型
什麼是多型、方法重寫與多載
Java 的繼承與實現
建構式與預設建構式
類變數、成員變數和區域性變數
成員變數和方法作用域
→ 基本資料型別
8 種基本資料型別:整型、浮點型、布林型、字元型
整型中 byte、short、int、long 的取值範圍
什麼是浮點型?什麼是單精度和雙精度?為什麼不能用浮點型表示金額?
→ 自動拆裝箱
什麼是包裝型別、什麼是基本型別、什麼是自動拆裝箱
Integer 的快取機制
→ String
字串的不可變性
JDK 6 和 JDK 7 中 substring 的原理及區別、
replaceFirst、replaceAll、replace 區別、
String 對“+”的多載、字串拼接的幾種方式和區別
String.valueOf 和 Integer.toString 的區別、
switch 對 String 的支援
字串池、常量池(執行時常量池、Class 常量池)、intern
→ 熟悉 Java 中各種關鍵字
transient、instanceof、final、static、volatile、synchronized、const 原理及用法
→ 集合類
常用集合類的使用、ArrayList 和 LinkedList 和 Vector 的區別 、SynchronizedList 和 Vector 的區別、HashMap、HashTable、ConcurrentHashMap 區別、
Set 和 List 區別?Set 如何保證元素不重覆?
Java 8 中 stream 相關用法、apache 集合處理工具類的使用、不同版本的 JDK 中 HashMap 的實現的區別以及原因
Collection 和 Collections 區別
Arrays.asList 獲得的 List 使用時需要註意什麼
Enumeration 和 Iterator 區別
fail-fast 和 fail-safe
CopyOnWriteArrayList、ConcurrentSkipListMap
→ 列舉
列舉的用法、列舉的實現、列舉與單例、Enum 類
Java 列舉如何比較
switch 對列舉的支援
列舉的序列化如何實現
列舉的執行緒安全性問題
→ IO
字元流、位元組流、輸入流、輸出流、
同步、非同步、阻塞、非阻塞、Linux 5 種 IO 模型
BIO、NIO 和 AIO 的區別、三種 IO 的用法與原理、netty
→ 反射
反射與工廠樣式、反射有什麼用
Class 類、java.lang.reflect.*
→ 動態代理
靜態代理、動態代理
動態代理和反射的關係
動態代理的幾種實現方式
AOP
→ 序列化
什麼是序列化與反序列化、為什麼序列化、序列化底層原理、序列化與單例樣式、protobuf、為什麼說序列化並不安全
→ 註解
元註解、自定義註解、Java 中常用註解使用、註解與反射的結合
Spring 常用註解
→ JMS
什麼是 Java 訊息服務、JMS 訊息傳送模型
→ JMX
java.lang.management.*、 javax.management.*
→ 泛型
泛型與繼承、型別擦除、泛型中 KTVE? object 等的含義、泛型各種用法
限定萬用字元和非限定萬用字元、上下界限定符 extends 和 super
List
List > 和 List
→ 單元測試
junit、mock、mockito、記憶體資料庫(h2)
→ 正則運算式
java.lang.util.regex.*
→ 常用的 Java 工具庫
commons.lang、commons.*…、 guava-libraries、 netty
→ API & SPI
API、API 和 SPI 的關係和區別
如何定義 SPI、SPI 的實現原理
→ 異常
異常型別、正確處理異常、自定義異常
Error 和 Exception
異常鏈、try-with-resources
finally 和 return 的執行順序
→ 時間處理
時區、冬令時和夏令時、時間戳、Java 中時間 API
格林威治時間、CET,UTC,GMT,CST 幾種常見時間的含義和關係
SimpleDateFormat 的執行緒安全性問題
Java 8 中的時間處理
如何在東八區的計算機上獲取美國時間
→ 編碼方式
Unicode、有了 Unicode 為啥還需要 UTF-8
GBK、GB2312、GB18030 之間的區別
UTF8、UTF16、UTF32 區別
URL 編解碼、Big Endian 和 Little Endian
如何解決亂碼問題
→ 語法糖
Java 中語法糖原理、解語法糖
語法糖:switch 支援 String 與列舉、泛型、自動裝箱與拆箱、方法變長引數、列舉、內部類、條件編譯、 斷言、數值字面量、for-each、try-with-resource、Lambda 運算式
String、Integer、Long、Enum、
BigDecimal、ThreadLocal、ClassLoader & URLClassLoader、
ArrayList & LinkedList、
HashMap & LinkedHashMap & TreeMap & CouncurrentHashMap、HashSet & LinkedHashSet & TreeSet
→ 併發與並行
什麼是併發、什麼是並行
併發與並行的區別
→ 什麼是執行緒,與行程的區別
執行緒的實現、執行緒的狀態、優先順序、執行緒排程、建立執行緒的多種方式、守護執行緒
執行緒與行程的區別
→ 執行緒池
自己設計執行緒池、submit() 和 execute()、執行緒池原理
為什麼不允許使用 Executors 建立執行緒池
→ 執行緒安全
死鎖、死鎖如何排查、執行緒安全和記憶體模型的關係
→ 鎖
CAS、樂觀鎖與悲觀鎖、資料庫相關鎖機制、分散式鎖、偏向鎖、輕量級鎖、重量級鎖、monitor、
鎖最佳化、鎖消除、鎖粗化、自旋鎖、可重入鎖、阻塞鎖、死鎖
→ 死鎖
什麼是死鎖
死鎖如何解決
→ synchronized
synchronized 是如何實現的?
synchronized 和 lock 之間關係、不使用 synchronized 如何實現一個執行緒安全的單例
synchronized 和原子性、可見性和有序性之間的關係
→ volatile
happens-before、記憶體屏障、編譯器指令重排和 CPU 指令重
volatile 的實現原理
volatile 和原子性、可見性和有序性之間的關係
有了 symchronized 為什麼還需要 volatile
→ sleep 和 wait
→ wait 和 notify
→ notify 和 notifyAll
→ ThreadLocal
→ 寫一個死鎖的程式
→ 寫程式碼來解決生產者消費者問題
→ 並方包
Thread、Runnable、Callable、ReentrantLock、ReentrantReadWriteLock、Atomic*、Semaphore、CountDownLatch、ConcurrentHashMap、Executors
2 底層篇
→ JVM 記憶體結構
class 檔案格式、執行時資料區:堆、棧、方法區、直接記憶體、執行時常量池、
堆和棧區別
Java 中的物件一定在堆上分配嗎?
→ Java 記憶體模型
計算機記憶體模型、快取一致性、MESI 協議
可見性、原子性、順序性、happens-before、
記憶體屏障、synchronized、volatile、final、鎖
→ 垃圾回收
GC 演演算法:標記清除、取用計數、複製、標記壓縮、分代回收、增量式回收
GC 引數、物件存活的判定、垃圾收集器(CMS、G1、ZGC、Epsilon)
→ JVM 引數及調優
-Xmx、-Xmn、-Xms、Xss、-XX:SurvivorRatio、
-XX:PermSize、-XX:MaxPermSize、-XX:MaxTenuringThreshold
→ Java 物件模型
oop-klass、物件頭
→ HotSpot
即時編譯器、編譯最佳化
→ 虛擬機器效能監控與故障處理工具
jps, jstack, jmap, jstat, jconsole, jinfo, jhat, javap, btrace, TProfiler
Arthas
classLoader、類載入過程、雙親委派(破壞雙親委派)、模組化(jboss modules、osgi、jigsaw)
什麼是編譯(前端編譯、後端編譯)、什麼是反編譯
JIT、JIT 最佳化(逃逸分析、棧上分配、標量替換、鎖最佳化)
編譯工具:javac
反編譯工具:javap 、jad 、CRF
3
進階篇
→ 位元組碼、class 檔案格式
→ CPU 快取,L1,L2,L3 和偽共享
→ 尾遞迴
→ 位運算
用位運算實現加、減、乘、除、取餘
設計樣式的六大原則:
開閉原則(Open Close Principle)、里氏代換原則(Liskov Substitution Principle)、依賴倒轉原則(Dependence Inversion Principle)
介面隔離原則(Interface Segregation Principle)、迪米特法則(最少知道原則)(Demeter Principle)、合成復用原則(Composite Reuse Principle)
→ 瞭解 23 種設計樣式
建立型樣式:單例樣式、抽象工廠樣式、建造者樣式、工廠樣式、原型樣式。
結構型樣式:配接器樣式、橋接樣式、裝飾樣式、組合樣式、外觀樣式、享元樣式、代理樣式。
行為型樣式:模版方法樣式、命令樣式、迭代器樣式、觀察者樣式、中介者樣式、備忘錄樣式、直譯器樣式(Interpreter 樣式)、狀態樣式、策略樣式、職責鏈樣式(責任鏈樣式)、訪問者樣式。
→ 會使用常用設計樣式
單例的七種寫法:懶漢——執行緒不安全、懶漢——執行緒安全、餓漢、餓漢——變種、靜態內部類、列舉、雙重校驗鎖
工廠樣式、配接器樣式、策略樣式、模板方法樣式、觀察者樣式、外觀樣式、代理樣式等必會
→ 不用 synchronized 和 lock,實現執行緒安全的單例樣式
→ 實現 AOP
→ 實現 IOC
→ nio 和 reactor 設計樣式
→ tcp、udp、http、https 等常用協議
三次握手與四次關閉、流量控制和擁塞控制、OSI 七層模型、tcp 粘包與拆包
→ http/1.0 http/1.1 http/2 之前的區別
http 中 get 和 post 區別
常見的 web 請求傳回的狀態碼
404、302、301、500分別代表什麼
→ http/3
→ Java RMI,Socket,HttpClient
→ cookie 與 session
cookie 被禁用,如何實現 session
→ 用 Java 寫一個簡單的靜態檔案的 HTTP 伺服器
→ 瞭解 nginx 和 apache 伺服器的特性並搭建一個對應的伺服器
→ 用 Java 實現 FTP、SMTP 協議
→ 行程間通訊的方式
→ 什麼是 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 之間的區別
→ Spring
Bean 的初始化
AOP 原理
實現 Spring 的IOC
Spring 四種依賴註入方式
→ Spring MVC
什麼是 MVC
Spring mvc 與 Struts mvc 的區別
→ Spring Boot
Spring Boot 2.0、起步依賴、自動配置、
Spring Boot 的 starter 原理,自己實現一個 starter
→ Spring Security
→ Spring Cloud
服務發現與註冊:Eureka、Zookeeper、Consul
負載均衡:Feign、Spring Cloud Loadbalance
服務配置:Spring Cloud Config
服務限流與熔斷:Hystrix
服務鏈路追蹤:Dapper
服務閘道器、安全、訊息
→ JBoss
→ tomcat
→ jetty
→ Weblogic
→ git & svn
→ maven & gradle
→ Intellij IDEA
常用外掛:Maven Helper 、FindBugs-IDEA、阿裡巴巴程式碼規約檢測、GsonFormat
Lombok plugin、.ignore、Mybatis plugin
4
高階篇
→ Java 8
lambda 運算式、Stream API、時間 API
→ Java 9
Jigsaw、Jshell、Reactive Streams
→ Java 10
區域性變數型別推斷、G1 的並行 Full GC、ThreadLocal 握手機制
→ Java 11
ZGC、Epsilon、增強 var
→ Spring 5
響應式程式設計
→ Spring Boot 2.0
→ HTTP/2
→ HTTP/3
使用單例、使用 Future 樣式、使用執行緒池
選擇就緒、減少背景關係切換、減少鎖粒度、資料壓縮、結果快取
→ dump 獲取
執行緒 Dump、記憶體 Dump、gc 情況
→ dump 分析
分析死鎖、分析記憶體洩露
→ dump 分析及獲取工具
jstack、jstat、jmap、jhat、Arthas
→ 自己編寫各種 outofmemory,stackoverflow 程式
HeapOutOfMemory、 Young OutOfMemory、
MethodArea OutOfMemory、ConstantPool OutOfMemory、
DirectMemory OutOfMemory、Stack OutOfMemory Stack OverFlow
→ Arthas
jvm 相關、class/classloader 相關、monitor/watch/trace 相關、
options、管道、後臺非同步任務
檔案:https://alibaba.github.io/arthas/advanced-use.html
→ 常見問題解決思路
記憶體上限溢位、執行緒死鎖、類載入衝突
→ 使用工具嘗試解決以下問題,並寫下總結
當一個 Java 程式響應很慢時如何查詢問題
當一個 Java 程式頻繁 FullGC 時如何解決問題
如何檢視垃圾回收日誌
當一個 Java 應用發生 OutOfMemory 時該如何解決
如何判斷是否出現死鎖
如何判斷是否存在記憶體洩露
使用 Arthas 快速排查 Spring Boot 應用404/401問題
使用 Arthas 排查線上應用日誌打滿問題
利用 Arthas 排查 Spring Boot 應用 NoSuchMethodError
→ 編譯與反編譯
→ Java 程式碼的編譯與反編譯
→ Java 的反編譯工具
javap 、jad 、CRF
→ 即時編譯器
→ 編譯過程
詞法分析,語法分析(LL 演演算法,遞迴下降演演算法,LR 演演算法)
語意分析,執行時環境,中間程式碼,程式碼生成,程式碼最佳化
→ Linux 的常用命令
→ 行程間通訊
→ 行程同步
生產者消費者問題、哲學家就餐問題、讀者寫者問題
→ 緩衝區上限溢位
→ 分段和分頁
→ 虛擬記憶體與主存
→ 虛擬記憶體管理
→ 換頁演演算法
→ MySQL 執行引擎
→ MySQL 執行計劃
如何檢視執行計劃,如何根據執行計劃進行 SQL 最佳化
→ 索引
Hash 索引、B 樹索引(B+樹、和B樹、R樹)
普通索引、唯一索引
改寫索引、最左字首原則、索引下推
→ SQL 最佳化
→ 資料庫事務和隔離級別
事務的隔離級別、事務能不能實現鎖的功能
→ 資料庫鎖
行鎖、表鎖、使用資料庫鎖實現樂觀鎖、
→ 連線
內連線,左連線,右連線
→ 資料庫主備搭建
→ binlog
→ redolog
→ 記憶體資料庫
h2
→ 分庫分表
→ 讀寫分離
→ 常用的 NoSql 資料庫
redis、memcached
→ 分別使用資料庫鎖、NoSql 實現分散式鎖
→ 效能調優
→ 資料庫連線池
→ 簡單的資料結構
棧、佇列、連結串列、陣列、雜湊表、
棧和佇列的相同和不同之處
棧通常採用的兩種儲存結構
→ 樹
二叉樹、字典樹、平衡樹、排序樹、
B 樹、B+ 樹、R 樹、多路樹、紅黑樹
→ 堆
大根堆、小根堆
→ 圖
有向圖、無向圖、拓撲
→ 排序演演算法
穩定的排序:氣泡排序、插入排序、雞尾酒排序、桶排序、計數排序、歸併排序、原地歸併排序、二叉排序樹排序、鴿巢排序、基數排序、侏儒排序、圖書館排序、塊排序
不穩定的排序:選擇排序、希爾排序、Clover 排序演演算法、梳排序、堆排序、平滑排序、快速排序、內省排序、耐心排序
各種排序演演算法和時間複雜度
→ 兩個棧實現佇列,和兩個佇列實現棧
→ 深度優先和廣度優先搜尋
→ 全排列、貪心演演算法、KMP 演演算法、hash 演演算法
→ 海量資料處理
分治,hash 對映,堆排序,雙層桶劃分,Bloom Filter,bitmap,資料庫索引,mapreduce 等。
→ Zookeeper
基本概念、常見用法
→ Solr,Lucene,ElasticSearch
在 linux 上部署 solr,solrcloud,新增、刪除、查詢索引
→ Storm,流式計算,瞭解 Spark,S4
在 linux 上部署 storm,用 zookeeper 做協調,執行 storm hello world,local 和 remote 樣式執行除錯 storm topology。
→ Hadoop,離線計算
HDFS、MapReduce
→ 分散式日誌收集 flume,kafka,logstash
→ 資料挖掘,mahout
→ XSS
XSS 的防禦
→ CSRF
→ 註入攻擊
SQL 註入、XML 註入、CRLF 註入
→ 檔案上傳漏洞
→ 加密與解密
對稱加密、非對稱加密、雜湊演演算法、加鹽雜湊演演算法
MD5,SHA1、DES、AES、RSA、DSA
彩虹表
→ DDOS攻擊
DOS 攻擊、DDOS 攻擊
memcached 為什麼可以導致 DDos 攻擊、什麼是反射型 DDoS
如何透過 Hash 碰撞進行 DOS 攻擊
→ SSL、TLS,HTTPS
→ 用 openssl 簽一個證書部署到 apache 或 nginx
5 架構篇
資料一致性、服務治理、服務降級
→ 分散式事務
2PC、3PC、CAP、BASE、 可靠訊息最終一致性、最大努力通知、TCC
→ Dubbo
服務註冊、服務發現,服務治理
http://dubbo.apache.org/zh-cn/
→ 分散式資料庫
怎樣打造一個分散式資料庫、什麼時候需要分散式資料庫、
mycat、otter、HBase
→ 分散式檔案系統
mfs、fastdfs
→ 分散式快取
快取一致性、快取命中率、快取冗餘
→ 限流降級
Hystrix、Sentinal
→ 演演算法
共識演演算法、Raft 協議、Paxos 演演算法與 Raft 演演算法、
拜占庭問題與演演算法、2PC、3PC
SOA、康威定律
→ ServiceMesh
sidecar
→ Docker & Kubernets
→ Spring Boot
→ Spring Cloud
→ 分庫分表
→ CDN 技術
→ 訊息佇列
ActiveMQ
監控
→ 監控什麼
CPU、記憶體、磁碟 I/O、網路 I/O 等
→ 監控手段
行程監控、語意監控、機器資源監控、資料波動
→ 監控資料採集
日誌、埋點
→ Dapper
tomcat 負載均衡、Nginx 負載均衡
四層負載均衡、七層負載均衡
DNS 原理、DNS 的設計
資料一致性
6
擴充套件篇
IaaS、SaaS、PaaS、虛擬化技術、openstack、Serverlsess
Solr、Lucene、Nutch、Elasticsearch
Shiro
雜湊演演算法、Merkle 樹、公鑰密碼演演算法、共識演演算法、
Raft 協議、Paxos 演演算法與 Raft 演演算法、拜占庭問題與演演算法、訊息認證碼與數字簽名
→ 比特幣
挖礦、共識機制、閃電網路、側鏈、熱點問題、分叉
→ 以太坊
→ 超級賬本
數學基礎、機器學習、人工神經網路、深度學習、應用場景。
→ 常用框架
TensorFlow、DeepLearning4J
Groovy、Python、Go、NodeJs、Swift、Rust
7 推薦書籍
《深入理解 Java 虛擬機器》
《Effective Java》
《深入分析 Java Web 技術內幕》
《大型網站技術架構》
《程式碼整潔之道》
《架構整潔之道》
《Head First 設計樣式》
《maven 實戰》
《區塊鏈原理、設計與應用》
《Java 併發程式設計實戰》
《鳥哥的 Linux 私房菜》
《從Paxos 到 Zookeeper》
《架構即未來》