拜托,學(xué)妹,別再問我怎么自學(xué) Java 了!和盤托出
假如有那么殘酷的一天,我不小心喝錯了一瓶藥,一下子抹掉了我這十多年的編程經(jīng)驗,把我變成了一只小白。我想自學(xué) Java,并且想要找到一份工作,我預(yù)計需要 6 個月的時間,前提條件是每天都處于高效率的學(xué)習(xí)狀態(tài)當(dāng)中,并且每天的學(xué)習(xí)時間至少在 12 個小時以上。
即便是這樣,我敢肯定,找到的工作肯定不會太好,勉強能夠維持生活吧,畢竟是零基礎(chǔ)入門啊。
如果想更進(jìn)一步,真正成為一名不可或缺的高級 Java 工程師,時間需要更久,兩年、三年、五年,直到禿的那天。
想著想著,我就覺得有必要為那一天做點準(zhǔn)備,以備不時之需。
(無中生妹。。。。。。)
01、第一個階段,環(huán)境和工具準(zhǔn)備
準(zhǔn)備一臺電腦,要能聯(lián)網(wǎng)
下載、安裝 JDK,配置 Java 開發(fā)環(huán)境
下載、配置 Maven
下載、安裝 IntelliJ IDEA
準(zhǔn)備一個 GitHub 倉庫(或者碼云),管理 Java 源代碼
Java 是一門計算機編程語言,學(xué)它的話,連臺電腦都沒有,學(xué)個屁。我有個親戚家的孩子想學(xué)編程,就只看書,家里連臺電腦都不配,說什么“先打好理論基礎(chǔ),再實操”,我真的是有點醉。
有了電腦,還得聯(lián)網(wǎng),自學(xué)的過程中肯定會遇到很多問題,遇到問題的時候先問搜索引擎,推薦谷歌和必應(yīng);實在沒有答案的話,也可以來找我,申請加入技術(shù)交流群,問問群里面的大佬們。
既然要學(xué) Java,JDK 是必須要先安裝的,否則 Java 程序就沒法編譯和執(zhí)行。
Maven 也是需要提前安裝和配置的,因為后面進(jìn)階的話,需要一些練手項目,它們通常都需要 Maven 來加載第三方類庫。
使用集成開發(fā)環(huán)境 IntelliJ IDEA 來敲 Java 代碼吧,比 Eclipse 更流行。千萬不要使用記事本編寫源代碼了,對于小白來說,時間是寶貴的,記事本只適合大牛們用來裝逼,不適合小白用來編程(入門),純浪費時間。
有了 IDEA,后面學(xué)習(xí)源碼的話,就會方便很多,包括反編譯字節(jié)碼。
如果英語功底不太好的話,建議安裝這兩款 IDEA 插件:chinese 和 translation。
如果注重編碼規(guī)范的話,建議安裝這兩款 IDEA 插件:Alibaba 和 SonarLint。
為什么還需要 GitHub 倉庫或者碼云倉庫呢?它們可以用來在線云同步源代碼,防止版本丟失。學(xué)到最后,還可以形成一套自己的工具庫,輪子就有了,上班的時候工作效率就會高很多,能直接用的代碼再也不用重新寫了。
02、第二個階段,Java 基礎(chǔ)入門
1)基本數(shù)據(jù)類型
8 種基本數(shù)據(jù)類型(boolean、char、byte、short、int、long、float、double)
整形中 byte、short、int、long 的取值范圍
單精度和雙精度
自動拆箱與裝箱
Integer 的緩存機制
2)操作符
算術(shù)運算符
邏輯運算符
比較運算符
3)流程控制語句
條件分支(if/else/else if、三元運算符、switch)
循環(huán)或者遍歷(for、while、do-while)
break 和 continue
4)包
創(chuàng)建包
導(dǎo)入包
包全名
5)main 方法詳解
public 關(guān)鍵字
void 關(guān)鍵字
main 方法
字符串?dāng)?shù)組參數(shù)(
String[] args)
6)數(shù)組
什么是數(shù)組?
訪問數(shù)組
遍歷數(shù)組
數(shù)組轉(zhuǎn)成 Stream
數(shù)組轉(zhuǎn)成 List
7)注釋
單行注釋
多行注釋
文檔注釋
8)字符串
雙引號字符串和 new 字符串對象
String、StringBuilder 和 StringBuffer ?之間的區(qū)別
字符串拼接的幾種方式
字符串常量池
關(guān)于 intern
03、第三個階段,Java 核心技術(shù)
1)面向?qū)ο?/p>
多態(tài)
構(gòu)造方法
局部變量、成員變量、靜態(tài)變量、常量
super 關(guān)鍵字
2)常用工具類
3)集合框架
4)反射機制
什么是反射?
反射有什么用?
Class 類
5)異常處理
為什么需要異常處理機制?
Error 和 Exception
try-catch-finally
自定義異常
盡量捕獲原始異常
不要打印堆棧后再拋出異常
不要用異常處理機制代替判斷
不要過早捕獲異常
6)注解
注解是什么?
注解的生命周期
注解裝飾的目標(biāo)
自定義注解
使用注解
7)IO 流
字符流、字節(jié)流
輸入流、輸出流
同步、異步
阻塞、非阻塞
BIO、NIO 和 AIO
8)序列化
什么是序列化和反序列化
Java 如何實現(xiàn)序列化和反序列化
Serializbale 和 Externalizable
serialVersionUID
9)泛型
什么是泛型?
類型擦除
泛型帶來的問題
泛型中 K T V E 這些特殊字幕的含義
通配符
上下界限定符 extends 和 super
10)單元測試
Junit
TestNG
11)編碼方式
ASCII
Unicode
UTF-8
GBK、GB2312
如何解決亂碼問題
12)并發(fā)編程
什么是并發(fā)
什么是并行
什么是線程
什么是進(jìn)程
線程的狀態(tài)
線程的優(yōu)先級
創(chuàng)建線程
創(chuàng)建線程池
什么是線程安全
多級緩存和一致性問題
CPU 時間片和原子性問題
指令重排和有序性問題
線程安全和內(nèi)存模型
happens-before
可重入鎖
阻塞鎖
樂觀鎖
悲觀鎖
分布式鎖
CAS
ABA
偏向鎖
輕量級鎖
重量級鎖
自旋鎖
什么是死鎖
如果避免死鎖
volatile
ThreadLocal
Executors
CountDownLatch
Thread
Runnable
Callable
ReentrantLock
ReentrantReadWriteLock
Atomic 相關(guān)類
13)Java 8 新特性
14)源碼閱讀
String
Integer
ArrayList
LinkedList
CopyOnWriteArrayList
HashMap
TreeMap
LinkedHashMap
ConcurrentHashMap
CopyOnWriteArrayList
04、第四個階段,Java 進(jìn)階升級
1)JVM
Java 內(nèi)存結(jié)構(gòu)
堆
棧
垃圾回收
JVM 參數(shù)調(diào)優(yōu)
Java 對象模型
HotSpot
編譯和反編譯
反編譯工具
JIT
虛擬機性能監(jiān)控和故障處理工具(jps、jstack、jmap、jstat、jconsole、javap)
2)性能優(yōu)化
使用單例
使用線程池
減少上下文切換
減小鎖粒度
數(shù)據(jù)壓縮
Stream 并行流
GC 調(diào)優(yōu)
JVM 內(nèi)存分配調(diào)優(yōu)
btrace
3)設(shè)計模式
設(shè)計模式的六大原則
創(chuàng)建型設(shè)計模式(單例、抽象工廠、建造者、工廠、原型)
結(jié)構(gòu)型設(shè)計模式(適配器、橋接、裝飾、組合、外觀、享元、代理)
行為型設(shè)計模式(模板方法、命令、迭代器、觀察者、中介者、備忘錄、解釋器、狀態(tài)、策略、責(zé)任鏈、訪問者)
單例的七種寫法
4)數(shù)據(jù)結(jié)構(gòu)和算法
簡單的數(shù)據(jù)結(jié)構(gòu)(棧、隊列、鏈表、數(shù)組、哈希表)
樹(二叉樹、字典樹、平衡樹、排序樹、B 樹、B+ 樹、R 樹、紅黑樹、多路樹)
堆
圖(拓?fù)?、有向圖、無向圖)
穩(wěn)定的排序算法(冒泡排序、插入排序、雞尾酒排序、桶排序、計數(shù)排序、歸并排序、原地歸并排序、二叉排序樹排序、鴿巢排序、基數(shù)排序、侏儒排序、圖書館排序、塊排序)
不穩(wěn)定的排序算法(選擇排序、希爾排序、梳排序、堆排序、平滑排序、快速排序、內(nèi)省排序、耐心排序、Clover 排序)
時間復(fù)雜度
空間復(fù)雜度
貪心算法
KMP 算法
5)操作系統(tǒng)
Linux 常用命令(find、top、tar、move、grep、tail、netstat、curl、wget、ping、ssh)
服務(wù)器性能指標(biāo)(qps、CPU 利用率)
進(jìn)程同步
分段和分頁
虛擬內(nèi)存和主存
6)網(wǎng)絡(luò)安全
CSRF
XSS
SQL 注入
加密和解密(對稱加密、非對稱加密)
MD5、SHA1、DES、RSA
DDOS 攻擊
HTTP 和 HTTPS
SSL
TLS
TCP 和 UDP
Cookie、Session
CDN
DNS
7)數(shù)據(jù)庫
8)大數(shù)據(jù)
搜索(Elasticsearch](https://mp.weixin.qq.com/s/ZjsZxle7m_dfmVwVkq2ayg) 、Solr)
流式計算(Storm、Spark、Flink)
Hadoop
9)服務(wù)器
Tomcat
jetty
Nginx
10)框架
Spring
MyBatis
Spring MVC
Spring Boot
Spring Security
Spring Cloud
Netty
Dubbo
11)消息隊列
Kafka
12)容器
Docker
K8s
05、第五個階段,活著最重要
技術(shù)是沒有終點的,也是學(xué)不完的,最重要的是活著、不禿。
零基礎(chǔ)入門的時候看書還是看視頻,我覺得成年人,何必做選擇題呢,兩個都要。喜歡看書就看書,喜歡看視頻就看視頻。
最重要的是在自學(xué)的過程中,一定不要眼高手低,要實戰(zhàn),把學(xué)到的技術(shù)投入到項目當(dāng)中,解決問題,之后進(jìn)一步錘煉自己的技術(shù)。
開源的項目我推薦 GitHub 上的 mall 和 vhr,前者是電商系統(tǒng),后者是微人事,都用的最前沿的技術(shù),并且文檔很全面,不怕暈頭轉(zhuǎn)向。
自學(xué)最怕的就是缺乏自驅(qū)力,一定要自律,杜絕“三天打魚兩天曬網(wǎng)”,到最后白忙活一場。
高度自律的同時,要保持耐心,不拋棄不放棄,切勿自怨自艾,每天給自己一點點鼓勵,學(xué)習(xí)的勁頭就會很足,不容易犯困。
技術(shù)學(xué)到手后,找工作的時候一定要好好準(zhǔn)備一份簡歷,不要無頭蒼蠅一樣去海投簡歷,容易“竹籃打水一場空”??梢詤⒖枷旅娴逆溄?,好好的準(zhǔn)備一下簡歷,畢竟是找工作的敲門磚。
拿到面試邀請后,在面試的過程中一定要大大方方,盡力把自己學(xué)到的知識舒適地表達(dá)出來,不要因為是自學(xué)就不夠自信,給面試官一個好的印象,面試成功的幾率就會大很多,加油吧,騷年!
公眾號:沉默王二
掘金:沉默王二
這是一枚沉默但有趣的程序員,你知道,他的文章風(fēng)趣幽默,讀起來就好像攢錢一樣爽快。
長按下圖二維碼關(guān)注,你將感受到一個有趣的靈魂,且每篇文章都有干貨。
------------------
原創(chuàng)不易,莫要白票,如果覺得有點用的話,請毫不留情地素質(zhì)四連吧,分享、點贊、在看、留言,隨你便,這將是我寫作更多優(yōu)質(zhì)文章的最強動力!
