Java 工程師成神之路 | 2019正式版
主要版本
更新時間
備注
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 的緩存機制
字符串的不可變性
JDK 6 和 JDK 7 中 substring 的原理及區別、
replaceFirst、replaceAll、replace 區別、
String 對“+”的重載、字符串拼接的幾種方式和區別
String.valueOf 和 Integer.toString 的區別、
switch 對 String 的支持
字符串池、常量池(運行時常量池、Class 常量池)、intern
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 對枚舉的支持
枚舉的序列化如何實現
枚舉的線程安全性問題
字符流、字節流、輸入流、輸出流、
同步、異步、阻塞、非阻塞、Linux 5 種 IO 模型
BIO、NIO 和 AIO 的區別、三種 IO 的用法與原理、netty
反射與工廠模式、反射有什么用
Class 類、java.lang.reflect.*
靜態代理、動態代理
動態代理和反射的關系
動態代理的幾種實現方式
AOP
什么是序列化與反序列化、為什么序列化、序列化底層原理、序列化與單例模式、protobuf、為什么說序列化并不安全
元注解、自定義注解、Java 中常用注解使用、注解與反射的結合
Spring 常用注解
什么是 Java 消息服務、JMS 消息傳送模型
java.lang.management.*、 javax.management.*
泛型與繼承、類型擦除、泛型中 KTVE? object 等的含義、泛型各種用法
限定通配符和非限定通配符、上下界限定符 extends 和 super
List
List> 和 List
junit、mock、mockito、內存數據庫(h2)
java.lang.util.regex.*
commons.lang、commons.*...、 guava-libraries、 netty
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 和 lock 之間關系、不使用 synchronized 如何實現一個線程安全的單例
synchronized 和原子性、可見性和有序性之間的關系
happens-before、內存屏障、編譯器指令重排和 CPU 指令重
volatile 的實現原理
volatile 和原子性、可見性和有序性之間的關系
有了 symchronized 為什么還需要 volatile
Thread、Runnable、Callable、ReentrantLock、ReentrantReadWriteLock、Atomic*、Semaphore、CountDownLatch、ConcurrentHashMap、Executors
2
底層篇
class 文件格式、運行時數據區:堆、棧、方法區、直接內存、運行時常量池、
堆和棧區別
Java 中的對象一定在堆上分配嗎?
計算機內存模型、緩存一致性、MESI 協議
可見性、原子性、順序性、happens-before、
內存屏障、synchronized、volatile、final、鎖
GC 算法:標記清除、引用計數、復制、標記壓縮、分代回收、增量式回收
GC 參數、對象存活的判定、垃圾收集器(CMS、G1、ZGC、Epsilon)
-Xmx、-Xmn、-Xms、Xss、-XX:SurvivorRatio、
-XX:PermSize、-XX:MaxPermSize、-XX:MaxTenuringThreshold
oop-klass、對象頭
即時編譯器、編譯優化
jps, jstack, jmap, jstat, jconsole, jinfo, jhat, javap, btrace, TProfiler
Arthas
classLoader、類加載過程、雙親委派(破壞雙親委派)、模塊化(jboss modules、osgi、jigsaw)
什么是編譯(前端編譯、后端編譯)、什么是反編譯
JIT、JIT 優化(逃逸分析、棧上分配、標量替換、鎖優化)
編譯工具:javac
反編譯工具:javap 、jad 、CRF
3
進階篇
用位運算實現加、減、乘、除、取余
設計模式的六大原則:
開閉原則(Open Close Principle)、里氏代換原則(Liskov Substitution Principle)、依賴倒轉原則(Dependence Inversion Principle)
接口隔離原則(Interface Segregation Principle)、迪米特法則(最少知道原則)(Demeter Principle)、合成復用原則(Composite Reuse Principle)
→ 了解 23 種設計模式
創建型模式:單例模式、抽象工廠模式、建造者模式、工廠模式、原型模式。
結構型模式:適配器模式、橋接模式、裝飾模式、組合模式、外觀模式、享元模式、代理模式。
行為型模式:模版方法模式、命令模式、迭代器模式、觀察者模式、中介者模式、備忘錄模式、解釋器模式(Interpreter 模式)、狀態模式、策略模式、職責鏈模式(責任鏈模式)、訪問者模式。
單例的七種寫法:懶漢——線程不安全、懶漢——線程安全、餓漢、餓漢——變種、靜態內部類、枚舉、雙重校驗鎖
工廠模式、適配器模式、策略模式、模板方法模式、觀察者模式、外觀模式、代理模式等必會
→ tcp、udp、http、https 等常用協議
三次握手與四次關閉、流量控制和擁塞控制、OSI 七層模型、tcp 粘包與拆包
http 中 get 和 post 區別
常見的 web 請求返回的狀態碼
404、302、301、500分別代表什么
cookie 被禁用,如何實現 session
域名解析、根域名服務器
DNS 污染、DNS 劫持、公共 DNS:114 DNS、Google DNS、OpenDNS
正向代理、反向代理
反向代理服務器
→ Servlet
生命周期
線程安全問題
filter 和 listener
web.xml 中常用配置及作用
什么是 OR Mapping
Hibernate 的緩存機制
Hibernate / Ibatis / MyBatis 之間的區別
什么是 MVC
Spring mvc 與 Struts mvc 的區別
Spring Boot 2.0、起步依賴、自動配置、
Spring Boot 的 starter 原理,自己實現一個 starter
→ Spring Cloud
服務發現與注冊:Eureka、Zookeeper、Consul
負載均衡:Feign、Spring Cloud Loadbalance
服務配置:Spring Cloud Config
服務限流與熔斷:Hystrix
服務鏈路追蹤:Dapper
服務網關、安全、消息
→ JBoss
→ git & svn
常用插件:Maven Helper 、FindBugs-IDEA、阿里巴巴代碼規約檢測、GsonFormat
Lombok plugin、.ignore、Mybatis plugin
4
高級篇
→ Java 8
lambda 表達式、Stream API、時間 API
Jigsaw、Jshell、Reactive Streams
局部變量類型推斷、G1 的并行 Full GC、ThreadLocal 握手機制
ZGC、Epsilon、增強 var
響應式編程
使用單例、使用 Future 模式、使用線程池
選擇就緒、減少上下文切換、減少鎖粒度、數據壓縮、結果緩存
→ dump 獲取
線程 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、管道、后臺異步任務
文檔:https://alibaba.github.io/arthas/advanced-use.html
內存溢出、線程死鎖、類加載沖突
當一個 Java 程序響應很慢時如何查找問題
當一個 Java 程序頻繁 FullGC 時如何解決問題
如何查看垃圾回收日志
當一個 Java 應用發生 OutOfMemory 時該如何解決
如何判斷是否出現死鎖
如何判斷是否存在內存泄露
使用 Arthas 快速排查 Spring Boot 應用404/401問題
使用 Arthas 排查線上應用日志打滿問題
利用 Arthas 排查 Spring Boot 應用 NoSuchMethodError
→ 編譯與反編譯
javap 、jad 、CRF
生產者消費者問題、哲學家就餐問題、讀者寫者問題
→ MySQL 執行引擎
如何查看執行計劃,如何根據執行計劃進行 SQL 優化
Hash 索引、B 樹索引(B+樹、和B樹、R樹)
普通索引、唯一索引
覆蓋索引、最左前綴原則、索引下推
事務的隔離級別、事務能不能實現鎖的功能
行鎖、表鎖、使用數據庫鎖實現樂觀鎖、
內連接,左連接,右連接
h2
redis、memcached
→ 簡單的數據結構
棧、隊列、鏈表、數組、哈希表、
棧和隊列的相同和不同之處
棧通常采用的兩種存儲結構
二叉樹、字典樹、平衡樹、排序樹、
B 樹、B+ 樹、R 樹、多路樹、紅黑樹
大根堆、小根堆
有向圖、無向圖、拓撲
穩定的排序:冒泡排序、插入排序、雞尾酒排序、桶排序、計數排序、歸并排序、原地歸并排序、二叉排序樹排序、鴿巢排序、基數排序、侏儒排序、圖書館排序、塊排序
不穩定的排序:選擇排序、希爾排序、Clover 排序算法、梳排序、堆排序、平滑排序、快速排序、內省排序、耐心排序
各種排序算法和時間復雜度
分治,hash 映射,堆排序,雙層桶劃分,Bloom Filter,bitmap,數據庫索引,mapreduce 等。
→ Zookeeper
基本概念、常見用法
在 linux 上部署 solr,solrcloud,新增、刪除、查詢索引
在 linux 上部署 storm,用 zookeeper 做協調,運行 storm hello world,local 和 remote 模式運行調試 storm topology。
HDFS、MapReduce
→ XSS
XSS 的防御
SQL 注入、XML 注入、CRLF 注入
對稱加密、非對稱加密、哈希算法、加鹽哈希算法
MD5,SHA1、DES、AES、RSA、DSA
彩虹表
DOS 攻擊、DDOS 攻擊
memcached 為什么可以導致 DDos 攻擊、什么是反射型 DDoS
如何通過 Hash 碰撞進行 DOS 攻擊
5
架構篇
數據一致性、服務治理、服務降級
2PC、3PC、CAP、BASE、 可靠消息最終一致性、最大努力通知、TCC
服務注冊、服務發現,服務治理
http://dubbo.apache.org/zh-cn/
怎樣打造一個分布式數據庫、什么時候需要分布式數據庫、
mycat、otter、HBase
mfs、fastdfs
緩存一致性、緩存命中率、緩存冗余
Hystrix、Sentinal
共識算法、Raft 協議、Paxos 算法與 Raft 算法、
拜占庭問題與算法、2PC、3PC
SOA、康威定律
sidecar
→ 分庫分表
ActiveMQ
監控
→ 監控什么
CPU、內存、磁盤 I/O、網絡 I/O 等
進程監控、語義監控、機器資源監控、數據波動
日志、埋點
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》
《架構即未來》
后臺對話回復:"成神導圖",
即可獲得成神之路系列思維導圖。
Java 任務調度 緩存 數據庫
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。