假如有那么殘酷的一天,我不小心喝錯(cuò)了一瓶藥莽鸿,一下子抹掉了我這十多年的編程經(jīng)驗(yàn)昧旨,把我變成了一只小白拾给。我想自學(xué) Java,并且想要找到一份工作兔沃,我預(yù)計(jì)需要 6 個(gè)月的時(shí)間蒋得,前提條件是每天都處于高效率的學(xué)習(xí)狀態(tài)當(dāng)中,并且每天的學(xué)習(xí)時(shí)間至少在 12 個(gè)小時(shí)以上乒疏。
即便是這樣额衙,我敢肯定,找到的工作肯定不會太好怕吴,勉強(qiáng)能夠維持生活吧窍侧,畢竟是零基礎(chǔ)入門啊。
如果想更進(jìn)一步转绷,真正成為一名不可或缺的高級 Java 工程師伟件,時(shí)間需要更久,兩年议经、三年锋爪、五年,直到禿的那天爸业。
想著想著其骄,我就覺得有必要為那一天做點(diǎn)準(zhǔn)備,以備不時(shí)之需扯旷。
01拯爽、第一個(gè)階段,環(huán)境和工具準(zhǔn)備
- 準(zhǔn)備一臺電腦钧忽,要能聯(lián)網(wǎng)
- 下載毯炮、安裝 JDK,配置 Java 開發(fā)環(huán)境
- 下載耸黑、配置 Maven
- 下載桃煎、安裝 IntelliJ IDEA
- 準(zhǔn)備一個(gè) GitHub 倉庫(或者碼云),管理 Java 源代碼
Java 是一門計(jì)算機(jī)編程語言大刊,學(xué)它的話为迈,連臺電腦都沒有,學(xué)個(gè)屁缺菌。我有個(gè)親戚家的孩子想學(xué)編程葫辐,就只看書,家里連臺電腦都不配伴郁,說什么“先打好理論基礎(chǔ)耿战,再實(shí)操”,我真的是有點(diǎn)醉焊傅。
有了電腦剂陡,還得聯(lián)網(wǎng)狈涮,自學(xué)的過程中肯定會遇到很多問題,遇到問題的時(shí)候先問搜索引擎鸭栖,推薦谷歌和必應(yīng)薯嗤;實(shí)在沒有答案的話,也可以來找我纤泵,申請加入技術(shù)交流群骆姐,問問群里面的大佬們。
既然要學(xué) Java捏题,JDK 是必須要先安裝的玻褪,否則 Java 程序就沒法編譯和執(zhí)行。
Maven 也是需要提前安裝和配置的公荧,因?yàn)楹竺孢M(jìn)階的話带射,需要一些練手項(xiàng)目,它們通常都需要 Maven 來加載第三方類庫循狰。
使用集成開發(fā)環(huán)境 IntelliJ IDEA 來敲 Java 代碼吧窟社,比 Eclipse 更流行。千萬不要使用記事本編寫源代碼了绪钥,對于小白來說灿里,時(shí)間是寶貴的,記事本只適合大牛們用來裝逼程腹,不適合小白用來編程(入門)匣吊,純浪費(fèi)時(shí)間。
有了 IDEA寸潦,后面學(xué)習(xí)源碼的話色鸳,就會方便很多,包括反編譯字節(jié)碼见转。
如果英語功底不太好的話命雀,建議安裝這兩款 IDEA 插件:chinese 和 translation。
如果注重編碼規(guī)范的話斩箫,建議安裝這兩款 IDEA 插件:Alibaba 和 SonarLint吏砂。
為什么還需要 GitHub 倉庫或者碼云倉庫呢?它們可以用來在線云同步源代碼校焦,防止版本丟失赊抖。學(xué)到最后,還可以形成一套自己的工具庫寨典,輪子就有了,上班的時(shí)候工作效率就會高很多房匆,能直接用的代碼再也不用重新寫了耸成。
02报亩、第二個(gè)階段,Java 基礎(chǔ)入門
1)基本數(shù)據(jù)類型
- 8 種基本數(shù)據(jù)類型(boolean井氢、char弦追、byte、short花竞、int劲件、long、float约急、double)
- 整形中 byte零远、short、int厌蔽、long 的取值范圍
- 單精度和雙精度
- 為什么不能使用“==”比較浮點(diǎn)數(shù)
- 基本類型和包裝類型的區(qū)別
- 自動(dòng)拆箱與裝箱
- Integer 的緩存機(jī)制
2)操作符
- 算術(shù)運(yùn)算符
- 邏輯運(yùn)算符
- 比較運(yùn)算符
3)流程控制語句
- 條件分支(if/else/else if牵辣、三元運(yùn)算符、switch)
- 循環(huán)或者遍歷(for奴饮、while纬向、do-while)
- break 和 continue
4)包
- 創(chuàng)建包
- 導(dǎo)入包
- 包全名
5)main 方法詳解
- public 關(guān)鍵字
- static 關(guān)鍵字
- void 關(guān)鍵字
- main 方法
- 字符串?dāng)?shù)組參數(shù)(
String[] args
)
6)數(shù)組
- 什么是數(shù)組?
- 訪問數(shù)組
- 遍歷數(shù)組
- 打印數(shù)組
- 可變參數(shù)
- 數(shù)組排序
- 數(shù)組轉(zhuǎn)成 Stream
- 數(shù)組轉(zhuǎn)成 List
- 數(shù)組搜索
- java.util.Arrays
- 數(shù)組越界
7)注釋
- 單行注釋
- 多行注釋
- 文檔注釋
- 注釋真的不會被執(zhí)行嗎戴卜?
- 優(yōu)秀的程序員真的不寫注釋嗎
8)字符串
- 雙引號字符串和 new 字符串對象
- 字符串為什么是不可變的逾条?
- String、StringBuilder 和 StringBuffer 之間的區(qū)別
- 字符串拼接的幾種方式
- 字符串常量池
- 關(guān)于 intern
- 字符串比較(== 和 equals)
- 字符串拆分
- 字符串操作小技巧
- 字符串轉(zhuǎn)整形
- 生成 UUID
- 字符串可以引用傳遞嗎膳帕?
- 字符串長度
- 關(guān)于 substring
03、第三個(gè)階段薇缅,Java 核心技術(shù)
1)面向?qū)ο?/p>
- 面向?qū)ο蠛兔嫦蜻^程
- 封裝
- 繼承
- 多態(tài)
- 接口
- 抽象類
- 重寫和重載
- 構(gòu)造方法
- 局部變量、成員變量浮毯、靜態(tài)變量债蓝、常量
- 值傳遞還是引用傳遞
- final 關(guān)鍵字
- this 關(guān)鍵字
- super 關(guān)鍵字
- 不可變對象
- equals() 和 hashCode()
- 打印 Java 對象
- NullPointerException
2)常用工具類
- 字符串相關(guān)的工具類
- 日期時(shí)間相關(guān)的工具類
- 枚舉
- 隨機(jī)數(shù)
- 正則表達(dá)式
- Apache-commons 工具庫
- Guava 工具庫
3)集合框架
- ArrayList
- LinkedList
- ArrayList 和 LinkedList 之間的區(qū)別
- 不可變 List
- CopyOnWriteArrayList
- HashMap
- LinkedHashMap
- TreeMap
- ConcurrentHashMap
- fail-fast
4)反射機(jī)制
- 什么是反射壳鹤?
- 反射有什么用?
- Class 類
5)異常處理
- 為什么需要異常處理機(jī)制饰迹?
- Error 和 Exception
- try-catch-finally
- try-with-resource
- 自定義異常
- 盡量捕獲原始異常
- 不要打印堆棧后再拋出異常
- 不要用異常處理機(jī)制代替判斷
- 不要過早捕獲異常
6)注解
- 注解是什么芳誓?
- 注解的生命周期
- 注解裝飾的目標(biāo)
- 自定義注解
- 使用注解
7)IO 流
- 字符流余舶、字節(jié)流
- 輸入流、輸出流
- 同步锹淌、異步
- 阻塞匿值、非阻塞
- BIO、NIO 和 AIO
- NIO 2.0
8)序列化
- 什么是序列化和反序列化
- Java 如何實(shí)現(xiàn)序列化和反序列化
- Serializbale 和 Externalizable
- serialVersionUID
9)泛型
- 什么是泛型赂摆?
- 類型擦除
- 泛型帶來的問題
- 泛型中 K T V E 這些特殊字幕的含義
- 通配符
- 上下界限定符 extends 和 super
- 不要在集合中使用 Java 原始類型
10)單元測試
- Junit
- TestNG
11)編碼方式
- ASCII
- Unicode
- UTF-8
- GBK挟憔、GB2312
- 如何解決亂碼問題
12)并發(fā)編程
- 什么是并發(fā)
- 什么是并行
- 什么是線程
- 什么是進(jìn)程
- 線程的狀態(tài)
- 線程的優(yōu)先級
- 創(chuàng)建線程
- 創(chuàng)建線程池
- 什么是線程安全
- 多級緩存和一致性問題
- CPU 時(shí)間片和原子性問題
- 指令重排和有序性問題
- 線程安全和內(nèi)存模型
- happens-before
- 可重入鎖
- 阻塞鎖
- 樂觀鎖
- 悲觀鎖
- 分布式鎖
- CAS
- ABA
- 偏向鎖
- 輕量級鎖
- 重量級鎖
- 自旋鎖
- 什么是死鎖
- 如果避免死鎖
- synchronized
- 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、第四個(gè)階段烟号,Java 進(jìn)階升級
1)JVM
- Java 內(nèi)存結(jié)構(gòu)
- 堆
- 棧
- 垃圾回收
- JVM 參數(shù)調(diào)優(yōu)
- Java 對象模型
- HotSpot
- 類加載機(jī)制
- 編譯和反編譯
- 反編譯工具
- JIT
- 虛擬機(jī)性能監(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è)計(jì)模式
- 設(shè)計(jì)模式的六大原則
- 創(chuàng)建型設(shè)計(jì)模式(單例喷楣、抽象工廠趟大、建造者、工廠铣焊、原型)
- 結(jié)構(gòu)型設(shè)計(jì)模式(適配器逊朽、橋接、裝飾曲伊、組合叽讳、外觀、享元坟募、代理)
- 行為型設(shè)計(jì)模式(模板方法岛蚤、命令、迭代器懈糯、觀察者涤妒、中介者、備忘錄赚哗、解釋器她紫、狀態(tài)、策略屿储、責(zé)任鏈贿讹、訪問者)
- 單例的七種寫法
4)數(shù)據(jù)結(jié)構(gòu)和算法
- 簡單的數(shù)據(jù)結(jié)構(gòu)(棧、隊(duì)列够掠、鏈表民褂、數(shù)組、哈希表)
- 樹(二叉樹、字典樹助赞、平衡樹买羞、排序樹袁勺、B 樹雹食、B+ 樹、R 樹期丰、紅黑樹群叶、多路樹)
- 堆
- 圖(拓?fù)洹⒂邢驁D钝荡、無向圖)
- 穩(wěn)定的排序算法(冒泡排序街立、插入排序、雞尾酒排序埠通、桶排序赎离、計(jì)數(shù)排序、歸并排序端辱、原地歸并排序梁剔、二叉排序樹排序、鴿巢排序舞蔽、基數(shù)排序荣病、侏儒排序、圖書館排序渗柿、塊排序)
- 不穩(wěn)定的排序算法(選擇排序个盆、希爾排序、梳排序朵栖、堆排序颊亮、平滑排序、快速排序陨溅、內(nèi)省排序终惑、耐心排序、Clover 排序)
- 時(shí)間復(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ù)庫
- MySql
- 索引
- 存儲過程
- 分庫分表
- binlog
- 讀寫分離
- 數(shù)據(jù)庫緩存(Redis什猖、MongoDB)
- 數(shù)據(jù)庫中間件(MyCat)
- 數(shù)據(jù)庫連接池(Durid)
8)大數(shù)據(jù)
- 搜索(Elasticsearch 票彪、Solr)
- 流式計(jì)算(Storm、Spark不狮、Flink)
- Hadoop
9)服務(wù)器
- Tomcat
- jetty
- Nginx
10)框架
- Spring
- MyBatis
- Spring MVC
- Spring Boot
- Spring Security
- Spring Cloud
- Netty
- Dubbo
11)消息隊(duì)列
- RabbitMQ
- Kafka
12)容器
- Docker
- K8s
需要 Java 書單的話降铸,我在 GitHub 上發(fā)現(xiàn)了一個(gè)寶藏項(xiàng)目,光看了一下目錄摇零,就有點(diǎn)吸引我推掸。
需要的小伙伴可以按需自取,地址如下所示:
05驻仅、第五個(gè)階段谅畅,活著最重要
技術(shù)是沒有終點(diǎn)的,也是學(xué)不完的雾家,最重要的是活著铃彰、不禿。
零基礎(chǔ)入門的時(shí)候看書還是看視頻芯咧,我覺得成年人牙捉,何必做選擇題呢,兩個(gè)都要敬飒。喜歡看書就看書邪铲,喜歡看視頻就看視頻。
最重要的是在自學(xué)的過程中无拗,一定不要眼高手低带到,要實(shí)戰(zhàn),把學(xué)到的技術(shù)投入到項(xiàng)目當(dāng)中英染,解決問題揽惹,之后進(jìn)一步錘煉自己的技術(shù)。
開源的項(xiàng)目我推薦 GitHub 上的 mall 和 vhr四康,前者是電商系統(tǒng)搪搏,后者是微人事,都用的最前言的技術(shù)闪金,并且文檔很全面疯溺,不怕暈頭轉(zhuǎn)向论颅。
自學(xué)最怕的就是缺乏自驅(qū)力,一定要自律囱嫩,杜絕“三天打魚兩天曬網(wǎng)”恃疯,到最后白忙活一場。
高度自律的同時(shí)墨闲,要保持耐心今妄,不拋棄不放棄,切勿自怨自艾损俭,每天給自己一點(diǎn)點(diǎn)鼓勵(lì)蛙奖,學(xué)習(xí)的勁頭就會很足潘酗,不容易犯困杆兵。
技術(shù)學(xué)到手后,找工作的時(shí)候一定要好好準(zhǔn)備一份簡歷仔夺,不要無頭蒼蠅一樣去海投簡歷琐脏,容易“竹籃打水一場空”「淄茫可以參考下面的鏈接日裙,好好的準(zhǔn)備一下簡歷,畢竟是找工作的敲門磚惰蜜。
拿到面試邀請后,在面試的過程中一定要大大方方抛猖,盡力把自己學(xué)到的知識舒適地表達(dá)出來格侯,不要因?yàn)槭亲詫W(xué)就不夠自信,給面試官一個(gè)好的印象财著,面試成功的幾率就會大很多联四,加油吧,騷年撑教!