Java零基礎到大神必經之路,你準備好了嗎?

作者 | Hollis

本文轉載自公眾號Hollis(ID:hollischuang)


Java零基礎到大神必經之路,你準備好了嗎?

Java零基礎到大神必經之路,你準備好了嗎?


基礎篇

01 面向對象

→ 什麼是面向對象

  • 面向對象、面向過程
  • 面向對象的三大基本特徵和五大基本原則

→ 平臺無關性

  • Java 如何實現的平臺無關
  • JVM 還支持哪些語言(Kotlin、Groovy、JRuby、Jython、Scala)

→ 值傳遞

  • 值傳遞、引用傳遞
  • 為什麼說 Java 中只有值傳遞

→ 封裝、繼承、多態

  • 什麼是多態、方法重寫與重載
  • Java 的繼承與實現
  • 構造函數與默認構造函數
  • 類變量、成員變量和局部變量
  • 成員變量和方法作用域

02 Java 基礎知識

→ 基本數據類型

  • 7 種基本數據類型:整型、浮點型、布爾型、字符型
  • 整型中 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


Java零基礎到大神必經之路,你準備好了嗎?

底層篇

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


Java零基礎到大神必經之路,你準備好了嗎?

進階篇

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


Java零基礎到大神必經之路,你準備好了嗎?

高級篇

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

Java零基礎到大神必經之路,你準備好了嗎?

架構篇

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

  • 數據一致性


Java零基礎到大神必經之路,你準備好了嗎?

擴展篇


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

今天就到這裡啦,喜歡編程的小夥伴可以關注我哦!有學習方面的問題可以私信回覆:學習!


分享到:


相關文章: