歡迎光臨
每天分享高質量文章

Java 工程師成神之路 | 2019正式版

來自:Hollis(微訊號:hollischuang)

 

主要版本

更新時間

備註

v1.0

2015-08-01

首次釋出

v1.1

2018-03-12

增加新技術知識、完善知識體系

v2.0

2019-02-19

結構調整,更適合從入門到精通;進一步完善知識體系; 新技術補充;

1

基礎篇

 

01

 面向物件

→ 什麼是面向物件

面向物件、面向過程

面向物件的三大基本特徵和五大基本原則

→ 平臺無關性

Java 如何實現的平臺無關

JVM 還支援哪些語言(Kotlin、Groovy、JRuby、Jython、Scala)

→ 值傳遞

值傳遞、取用傳遞

為什麼說 Java 中只有值傳遞

→ 封裝、繼承、多型

什麼是多型、方法重寫與多載

Java 的繼承與實現

建構式與預設建構式

類變數、成員變數和區域性變數

成員變數和方法作用域

02
 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 > 和 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 運算式

03
 閱讀原始碼

 

String、Integer、Long、Enum、

BigDecimal、ThreadLocal、ClassLoader & URLClassLoader、

ArrayList & LinkedList、 

HashMap & LinkedHashMap & TreeMap & CouncurrentHashMap、HashSet & LinkedHashSet & TreeSet

04
 Java 併發程式設計

→ 併發與並行

什麼是併發、什麼是並行

併發與並行的區別

→ 什麼是執行緒,與行程的區別

執行緒的實現、執行緒的狀態、優先順序、執行緒排程、建立執行緒的多種方式、守護執行緒

執行緒與行程的區別

→ 執行緒池

自己設計執行緒池、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

底層篇

 

01
JVM

→ 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

02
 類載入機制

 

classLoader、類載入過程、雙親委派(破壞雙親委派)、模組化(jboss modules、osgi、jigsaw)

03
 編譯與反編譯

 

什麼是編譯(前端編譯、後端編譯)、什麼是反編譯

JIT、JIT 最佳化(逃逸分析、棧上分配、標量替換、鎖最佳化)

編譯工具:javac

反編譯工具:javap 、jad 、CRF

3

進階篇

 

01
 Java 底層知識

→ 位元組碼、class 檔案格式

→ CPU 快取,L1,L2,L3 和偽共享

→ 尾遞迴

→ 位運算

用位運算實現加、減、乘、除、取餘

02
 設計樣式

設計樣式的六大原則:

開閉原則(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 設計樣式

03
 網路程式設計知識

→ 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

→ 反向代理

正向代理、反向代理

反向代理伺服器

 

04
 框架知識

→ 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

服務閘道器、安全、訊息

05
 應用伺服器知識

→ JBoss

→ tomcat

→ jetty

→ Weblogic

06
 工具

 

→ git & svn

→ maven & gradle

→ Intellij IDEA

常用外掛:Maven Helper 、FindBugs-IDEA、阿裡巴巴程式碼規約檢測、GsonFormat

Lombok plugin、.ignore、Mybatis plugin

 

4

高階篇

 

01
 新技術

 

→ 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    

02
 效能最佳化

 

使用單例、使用 Future 樣式、使用執行緒池

選擇就緒、減少背景關係切換、減少鎖粒度、資料壓縮、結果快取

03
 線上問題分析

→ 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

04
 編譯原理知識

 

→ 編譯與反編譯

→ Java 程式碼的編譯與反編譯

→ Java 的反編譯工具

javap 、jad 、CRF

→ 即時編譯器

→ 編譯過程

詞法分析,語法分析(LL 演演算法,遞迴下降演演算法,LR 演演算法)

語意分析,執行時環境,中間程式碼,程式碼生成,程式碼最佳化

05
 作業系統知識

 

→ Linux 的常用命令

→ 行程間通訊

→ 行程同步

生產者消費者問題、哲學家就餐問題、讀者寫者問題

→ 緩衝區上限溢位

→ 分段和分頁

→ 虛擬記憶體與主存

→ 虛擬記憶體管理

→ 換頁演演算法

06
 資料庫知識

 

→ MySQL 執行引擎

→ MySQL 執行計劃

如何檢視執行計劃,如何根據執行計劃進行 SQL 最佳化

→ 索引

Hash 索引、B 樹索引(B+樹、和B樹、R樹)

普通索引、唯一索引

改寫索引、最左字首原則、索引下推

→ SQL 最佳化

→ 資料庫事務和隔離級別

事務的隔離級別、事務能不能實現鎖的功能

→ 資料庫鎖

行鎖、表鎖、使用資料庫鎖實現樂觀鎖、

→ 連線

內連線,左連線,右連線

→ 資料庫主備搭建

→ binlog

→ redolog

→ 記憶體資料庫

h2

→ 分庫分表

→ 讀寫分離

→ 常用的 NoSql 資料庫

redis、memcached

→ 分別使用資料庫鎖、NoSql 實現分散式鎖

→ 效能調優

→ 資料庫連線池

07
 資料結構與演演算法知識

 

→ 簡單的資料結構

棧、佇列、連結串列、陣列、雜湊表、

棧和佇列的相同和不同之處

棧通常採用的兩種儲存結構

→ 樹

二叉樹、字典樹、平衡樹、排序樹、

B 樹、B+ 樹、R 樹、多路樹、紅黑樹

→ 堆

大根堆、小根堆

→ 圖

有向圖、無向圖、拓撲

→ 排序演演算法

穩定的排序:氣泡排序、插入排序、雞尾酒排序、桶排序、計數排序、歸併排序、原地歸併排序、二叉排序樹排序、鴿巢排序、基數排序、侏儒排序、圖書館排序、塊排序

不穩定的排序:選擇排序、希爾排序、Clover 排序演演算法、梳排序、堆排序、平滑排序、快速排序、內省排序、耐心排序

各種排序演演算法和時間複雜度 

→ 兩個棧實現佇列,和兩個佇列實現棧

→ 深度優先和廣度優先搜尋

→ 全排列、貪心演演算法、KMP 演演算法、hash 演演算法

→ 海量資料處理

分治,hash 對映,堆排序,雙層桶劃分,Bloom Filter,bitmap,資料庫索引,mapreduce 等。

 

08
 大資料知識

 

→ 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

09
 網路安全知識

 

→ 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

架構篇

01
 分散式

 

資料一致性、服務治理、服務降級

→ 分散式事務

2PC、3PC、CAP、BASE、 可靠訊息最終一致性、最大努力通知、TCC

→ Dubbo

服務註冊、服務發現,服務治理

http://dubbo.apache.org/zh-cn/

→ 分散式資料庫

怎樣打造一個分散式資料庫、什麼時候需要分散式資料庫、

mycat、otter、HBase

→ 分散式檔案系統

mfs、fastdfs

→ 分散式快取

快取一致性、快取命中率、快取冗餘

→ 限流降級

Hystrix、Sentinal

→ 演演算法

共識演演算法、Raft 協議、Paxos 演演算法與 Raft 演演算法、

拜占庭問題與演演算法、2PC、3PC

02
 微服務

 

SOA、康威定律

→ ServiceMesh

sidecar

→ Docker & Kubernets

→ Spring Boot

→ Spring Cloud

 

03
 高併發

 

→ 分庫分表

→ CDN 技術

→ 訊息佇列

ActiveMQ

 

04

 監控

 

→ 監控什麼

CPU、記憶體、磁碟 I/O、網路 I/O 等

→ 監控手段

行程監控、語意監控、機器資源監控、資料波動

→ 監控資料採集

日誌、埋點

→ Dapper

05
 負載均衡

 

tomcat 負載均衡、Nginx 負載均衡

四層負載均衡、七層負載均衡

06
 DNS

 

DNS 原理、DNS 的設計

07
 CDN

資料一致性

6

擴充套件篇

 

01
 雲端計算

 

IaaS、SaaS、PaaS、虛擬化技術、openstack、Serverlsess

02
 搜尋引擎

Solr、Lucene、Nutch、Elasticsearch

03
 許可權管理

Shiro

 

04
 區塊鏈

雜湊演演算法、Merkle 樹、公鑰密碼演演算法、共識演演算法、

Raft 協議、Paxos 演演算法與 Raft 演演算法、拜占庭問題與演演算法、訊息認證碼與數字簽名

→ 比特幣

挖礦、共識機制、閃電網路、側鏈、熱點問題、分叉

→ 以太坊

→ 超級賬本

05
 人工智慧

 

數學基礎、機器學習、人工神經網路、深度學習、應用場景。

→ 常用框架

TensorFlow、DeepLearning4J

06
 loT

07
 量子計算

08
 AR & VR

09
 其他語言

 

Groovy、Python、Go、NodeJs、Swift、Rust

7

推薦書籍

 

《深入理解 Java 虛擬機器》
《Effective Java》
《深入分析 Java Web 技術內幕》
《大型網站技術架構》
《程式碼整潔之道》
《架構整潔之道》
《Head First 設計樣式》
《maven 實戰》
《區塊鏈原理、設計與應用》
《Java 併發程式設計實戰》
《鳥哥的 Linux 私房菜》
《從Paxos 到 Zookeeper》
《架構即未來》

贊(0)

分享創造快樂