拜託,學妹,別再問我怎麼自學 Java 了!和盤托出

2020-10-14 11:00:28

假如有那麼殘酷的一天,我不小心喝錯了一瓶藥,一下子抹掉了我這十多年的程式設計經驗,把我變成了一隻小白。我想自學 Java,並且想要找到一份工作,我預計需要 6 個月的時間,前提條件是每天都處於高效率的學習狀態當中,並且每天的學習時間至少在 12 個小時以上。

即便是這樣,我敢肯定,找到的工作肯定不會太好,勉強能夠維持生活吧,畢竟是零基礎入門啊。

如果想更進一步,真正成為一名不可或缺的高階 Java 工程師,時間需要更久,兩年、三年、五年,直到禿的那天。

想著想著,我就覺得有必要為那一天做點準備,以備不時之需。

01、第一個階段,環境和工具準備

  • 準備一臺電腦,要能聯網
  • 下載、安裝 JDK,設定 Java 開發環境
  • 下載、設定 Maven
  • 下載、安裝 IntelliJ IDEA
  • 準備一個 GitHub 倉庫(或者碼雲),管理 Java 原始碼

Java 是一門計算機程式語言,學它的話,連臺電腦都沒有,學個屁。我有個親戚家的孩子想學程式設計,就只看書,家裡連臺電腦都不配,說什麼「先打好理論基礎,再實操」,我真的是有點醉。

有了電腦,還得聯網,自學的過程中肯定會遇到很多問題,遇到問題的時候先問搜尋引擎,推薦谷歌和必應;實在沒有答案的話,也可以來找我,申請加入技術交流群,問問群裡面的大佬們。

既然要學 Java,JDK 是必須要先安裝的,否則 Java 程式就沒法編譯和執行。

Maven 也是需要提前安裝和設定的,因為後面進階的話,需要一些練手專案,它們通常都需要 Maven 來載入第三方類庫。

使用整合式開發環境 IntelliJ IDEA 來敲 Java 程式碼吧,比 Eclipse 更流行。千萬不要使用記事本編寫原始碼了,對於小白來說,時間是寶貴的,記事本只適合大牛們用來裝逼,不適合小白用來程式設計(入門),純浪費時間。

有了 IDEA,後面學習原始碼的話,就會方便很多,包括反編譯位元組碼。

如果英語功底不太好的話,建議安裝這兩款 IDEA 外掛:chinese 和 translation

如果注重編碼規範的話,建議安裝這兩款 IDEA 外掛:Alibaba 和 SonarLint

為什麼還需要 GitHub 倉庫或者碼雲倉庫呢?它們可以用來線上雲同步原始碼,防止版本丟失。學到最後,還可以形成一套自己的工具庫,輪子就有了,上班的時候工作效率就會高很多,能直接用的程式碼再也不用重新寫了。

02、第二個階段,Java 基礎入門

1)基本資料型別

2)操作符

  • 算術運運算元
  • 邏輯運運算元
  • 比較運運算元

3)流程控制語句

  • 條件分支(if/else/else if、三元運運算元、switch
  • 迴圈或者遍歷(for、while、do-while)
  • break 和 continue

4)包

  • 建立包
  • 匯入包
  • 包全名

5)main 方法詳解

  • public 關鍵字
  • static 關鍵字
  • void 關鍵字
  • main 方法
  • 字串陣列引數(String[] args

6)陣列

7)註釋

8)字串

03、第三個階段,Java 核心技術

1)物件導向

2)常用工具類

  • 字串相關的工具類
  • 日期時間相關的工具類
  • 列舉
  • 亂數
  • 正規表示式
  • Apache-commons 工具庫
  • Guava 工具庫

3)集合框架

4)反射機制

  • 什麼是反射?
  • 反射有什麼用?
  • Class 類

5)例外處理

  • 為什麼需要例外處理機制?
  • Error 和 Exception
  • try-catch-finally
  • try-with-resource
  • 自定義異常
  • 儘量捕獲原始異常
  • 不要列印堆疊後再丟擲異常
  • 不要用例外處理機制代替判斷
  • 不要過早捕獲異常

6)註解

  • 註解是什麼?
  • 註解的生命週期
  • 註解裝飾的目標
  • 自定義註解
  • 使用註解

7)IO 流

  • 字元流、位元組流
  • 輸入流、輸出流
  • 同步、非同步
  • 阻塞、非阻塞
  • BIO、NIO 和 AIO
  • NIO 2.0

8)序列化

  • 什麼是序列化和反序列化
  • Java 如何實現序列化和反序列化
  • Serializbale 和 Externalizable
  • serialVersionUID

9)泛型

10)單元測試

  • Junit
  • TestNG

11)編碼方式

  • ASCII
  • Unicode
  • UTF-8
  • GBK、GB2312
  • 如何解決亂碼問題

12)並行程式設計

  • 什麼是並行
  • 什麼是並行
  • 什麼是執行緒
  • 什麼是程序
  • 執行緒的狀態
  • 執行緒的優先順序
  • 建立執行緒
  • 建立執行緒池
  • 什麼是執行緒安全
  • 多級快取和一致性問題
  • CPU 時間片和原子性問題
  • 指令重排和有序性問題
  • 執行緒安全和記憶體模型
  • happens-before
  • 可重入鎖
  • 阻塞鎖
  • 樂觀鎖
  • 悲觀鎖
  • 分散式鎖
  • CAS
  • ABA
  • 偏向鎖
  • 輕量級鎖
  • 重量級鎖
  • 自旋鎖
  • 什麼是死鎖
  • 如果避免死鎖
  • synchronized
  • volatile
  • ThreadLocal
  • Executors
  • CountDownLatch
  • Thread
  • Runnable
  • Callable
  • ReentrantLock
  • ReentrantReadWriteLock
  • Atomic 相關類

13)Java 8 新特性

14)原始碼閱讀

  • String
  • Integer
  • ArrayList
  • LinkedList
  • CopyOnWriteArrayList
  • HashMap
  • TreeMap
  • LinkedHashMap
  • ConcurrentHashMap
  • CopyOnWriteArrayList

04、第四個階段,Java 進階升級

1)JVM

  • Java 記憶體結構
  • 垃圾回收
  • JVM 引數調優
  • Java 物件模型
  • HotSpot
  • 類載入機制
  • 編譯和反編譯
  • 反編譯工具
  • JIT
  • 虛擬機器器效能監控和故障處理工具(jps、jstack、jmap、jstat、jconsole、javap)

2)效能優化

  • 使用單例
  • 使用執行緒池
  • 減少上下文切換
  • 減小鎖粒度
  • 資料壓縮
  • Stream 並行流
  • GC 調優
  • JVM 記憶體分配調優
  • btrace

3)設計模式

  • 設計模式的六大原則
  • 建立型設計模式(單例、抽象工廠、建造者、工廠、原型)
  • 結構型設計模式(介面卡、橋接、裝飾、組合、外觀、享元、代理)
  • 行為型設計模式(模板方法、命令、迭代器、觀察者、中介者、備忘錄、直譯器、狀態、策略、責任鏈、存取者)
  • 單例的七種寫法

4)資料結構和演演算法

  • 簡單的資料結構(棧、佇列、連結串列、陣列、雜湊表)
  • 樹(二元樹、字典樹、平衡樹、排序樹、B 樹、B+ 樹、R 樹、紅黑樹、多路樹)
  • 圖(拓撲、有向圖、無向圖)
  • 穩定的排序演演算法(氣泡排序、插入排序、雞尾酒排序、桶排序、計數排序、歸併排序、原地歸併排序、二叉排序樹排序、鴿巢排序、基數排序、侏儒排序、圖書館排序、塊排序)
  • 不穩定的排序演演算法(選擇排序、希爾排序、梳排序、堆排序、平滑排序、快速排序、內省排序、耐心排序、Clover 排序)
  • 時間複雜度
  • 空間複雜度
  • 貪婪演演算法
  • KMP 演演算法

5)作業系統

  • Linux 常用命令(find、top、tar、move、grep、tail、netstat、curl、wget、ping、ssh)
  • 伺服器效能指標(qps、CPU 利用率)
  • 程序同步
  • 分段和分頁
  • 虛擬記憶體和主記憶體

6)網路安全

  • CSRF
  • XSS
  • SQL 注入
  • 加密和解密(對稱加密、非對稱加密)
  • MD5、SHA1、DES、RSA
  • DDOS 攻擊
  • HTTP 和 HTTPS
  • SSL
  • TLS
  • TCP 和 UDP
  • Cookie、Session
  • CDN
  • DNS

7)資料庫

  • MySql
  • 索引
  • 儲存過程
  • 分庫分表
  • binlog
  • 讀寫分離
  • 資料庫快取(RedisMongoDB
  • 資料庫中介軟體(MyCat)
  • 資料庫連線池(Durid)

8)巨量資料

  • 搜尋(Elasticsearch 、Solr)
  • 流式計算(Storm、Spark、Flink)
  • Hadoop

9)伺服器

  • Tomcat
  • jetty
  • Nginx

10)框架

  • Spring
  • MyBatis
  • Spring MVC
  • Spring Boot
  • Spring Security
  • Spring Cloud
  • Netty
  • Dubbo

11)訊息佇列

12)容器

  • Docker
  • K8s

需要 Java 書單的話,我在 GitHub 上發現了一個寶藏專案,光看了一下目錄,就有點吸引我。

需要的小夥伴可以按需自取,地址如下所示:

https://github.com/itwanger/JavaBooks

05、第五個階段,活著最重要

技術是沒有終點的,也是學不完的,最重要的是活著、不禿。

零基礎入門的時候看書還是看視訊,我覺得成年人,何必做選擇題呢,兩個都要。喜歡看書就看書,喜歡看視訊就看視訊。

最重要的是在自學的過程中,一定不要眼高手低,要實戰,把學到的技術投入到專案當中,解決問題,之後進一步錘鍊自己的技術。

開源的專案我推薦 GitHub 上的 mall 和 vhr,前者是電商系統,後者是微人事,都用的最前言的技術,並且檔案很全面,不怕暈頭轉向。

自學最怕的就是缺乏自驅力,一定要自律,杜絕「三天打魚兩天曬網」,到最後白忙活一場。

高度自律的同時,要保持耐心,不拋棄不放棄,切勿自怨自艾,每天給自己一點點鼓勵,學習的勁頭就會很足,不容易犯困。

技術學到手後,找工作的時候一定要好好準備一份簡歷,不要無頭蒼蠅一樣去海投簡歷,容易「竹籃打水一場空」。可以參考下面的連結,好好的準備一下簡歷,畢竟是找工作的敲門磚。

入職阿里後,才知道原來簡歷這麼寫

拿到面試邀請後,在面試的過程中一定要大大方方,盡力把自己學到的知識舒適地表達出來,不要因為是自學就不夠自信,給面試官一個好的印象,面試成功的機率就會大很多,加油吧,騷年!

沉默王二 CSDN認證部落格專家 部落格之星 部落格專家 Java 大牛
微信搜尋「沉默王二」,回覆關鍵字「666」獲取海量學習資源。我是沉默王二,《Web 全棧開發進階之路》作者,一枚沉默但有趣的程式設計師,關注即可提高學習效率。