Java工程师修炼之路
文章來自于微信公眾號:Hollis,作者網站:https://www.hollischuang.com/
 轉載過來方便查看
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》
 《架構即未來》
總結
以上是生活随笔為你收集整理的Java工程师修炼之路的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: 五谷豆浆的功效与作用、禁忌和食用方法
 - 下一篇: 2019-02-21-算法-进化