java 概述进阶
作者:沉默王二
鏈接:https://www.zhihu.com/question/267403723/answer/1520053322
來源:知乎
著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請注明出處。
假如有那么殘酷的一天,我不小心喝錯了一瓶藥,一下子抹掉了我這十多年的編程經(jīng)驗,把我變成了一只小白。我想自學(xué) Java,并且想要找到一份工作,我預(yù)計需要 6 個月的時間,前提條件是每天都處于高效率的學(xué)習(xí)狀態(tài)當(dāng)中,并且每天的學(xué)習(xí)時間至少在 12 個小時以上。
即便是這樣,我敢肯定,找到的工作肯定不會太好,勉強(qiáng)能夠維持生活吧,畢竟是零基礎(chǔ)入門啊。
如果想更進(jìn)一步,真正成為一名不可或缺的高級 Java 工程師,時間需要更久,兩年、三年、五年,直到禿的那天。
想著想著,我就覺得有必要為那一天做點(diǎn)準(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 是一門計算機(jī)編程語言,學(xué)它的話,連臺電腦都沒有,學(xué)個屁。我有個親戚家的孩子想學(xué)編程,就只看書,家里連臺電腦都不配,說什么“先打好理論基礎(chǔ),再實(shí)操”,我真的是有點(diǎn)醉。
有了電腦,還得聯(lián)網(wǎng),自學(xué)的過程中肯定會遇到很多問題,遇到問題的時候先問搜索引擎,推薦谷歌和必應(yīng);實(shí)在沒有答案的話,也可以來找我,申請加入技術(shù)交流群,問問群里面的大佬們。
既然要學(xué) Java,JDK 是必須要先安裝的,否則 Java 程序就沒法編譯和執(zhí)行。
Maven 也是需要提前安裝和配置的,因為后面進(jìn)階的話,需要一些練手項目,它們通常都需要 Maven 來加載第三方類庫。
使用集成開發(fā)環(huán)境 IntelliJ IDEA 來敲 Java 代碼吧,比 Eclipse 更流行。千萬不要使用記事本編寫源代碼了,對于小白來說,時間是寶貴的,記事本只適合大牛們用來裝逼,不適合小白用來編程(入門),純浪費(fèi)時間。
有了 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 的取值范圍
單精度和雙精度
為什么不能使用“==”比較浮點(diǎn)數(shù)
基本類型和包裝類型的區(qū)別
自動拆箱與裝箱
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、第三個階段,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)的工具類
日期時間相關(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 時間片和原子性問題
指令重排和有序性問題
線程安全和內(nèi)存模型
happens-before
可重入鎖
阻塞鎖
樂觀鎖
悲觀鎖
分布式鎖
CAS
ABA
偏向鎖
輕量級鎖
重量級鎖
自旋鎖
什么是死鎖
如果避免死鎖
synchronized
volatile
ThreadLocal
Executors
CountDownLatch
Thread
Runnable
Callable
ReentrantLock
ReentrantReadWriteLock
Atomic 相關(guān)類
13)Java 8 新特性
Lambda 表達(dá)式
Stream流
Optional
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
類加載機(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è)計模式
設(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ù)庫
MySql
索引
存儲過程
分庫分表
binlog
讀寫分離
數(shù)據(jù)庫緩存(Redis、MongoDB)
數(shù)據(jù)庫中間件(MyCat)
數(shù)據(jù)庫連接池(Durid)
8)大數(shù)據(jù)
搜索(Elasticsearch 、Solr)
流式計算(Storm、Spark、Flink)
Hadoop
9)服務(wù)器
Tomcat
jetty
Nginx
10)框架
Spring
MyBatis
Spring MVC
Spring Boot
Spring Security
Spring Cloud
Netty
Dubbo
11)消息隊列
RabbitMQ
Kafka
12)容器
Docker
K8s
需要 Java 書單的話,我在 GitHub 上發(fā)現(xiàn)了一個寶藏項目,光看了一下目錄,就有點(diǎn)吸引我。
需要的小伙伴可以按需自取,地址如下所示:
itwanger/JavaBooks
還有小伙伴說有沒有同步到碼云,我也搞來了:
沉默王二/JavaBooks
05、第五個階段,活著最重要
技術(shù)是沒有終點(diǎn)的,也是學(xué)不完的,最重要的是活著、不禿。
零基礎(chǔ)入門的時候看書還是看視頻,我覺得成年人,何必做選擇題呢,兩個都要。喜歡看書就看書,喜歡看視頻就看視頻。
最重要的是在自學(xué)的過程中,一定不要眼高手低,要實(shí)戰(zhàn),把學(xué)到的技術(shù)投入到項目當(dāng)中,解決問題,之后進(jìn)一步錘煉自己的技術(shù)。
開源的項目我推薦 GitHub 上的 mall 和 vhr,前者是電商系統(tǒng),后者是微人事,都用的最前言的技術(shù),并且文檔很全面,不怕暈頭轉(zhuǎn)向。
自學(xué)最怕的就是缺乏自驅(qū)力,一定要自律,杜絕“三天打魚兩天曬網(wǎng)”,到最后白忙活一場。
高度自律的同時,要保持耐心,不拋棄不放棄,切勿自怨自艾,每天給自己一點(diǎn)點(diǎn)鼓勵,學(xué)習(xí)的勁頭就會很足,不容易犯困。
技術(shù)學(xué)到手后,找工作的時候一定要好好準(zhǔn)備一份簡歷,不要無頭蒼蠅一樣去海投簡歷,容易“竹籃打水一場空”。可以參考下面的鏈接,好好的準(zhǔn)備一下簡歷,畢竟是找工作的敲門磚。
入職阿里后,才知道原來簡歷這么寫
總結(jié)
- 上一篇: Inmon和Kimball数仓建模思想
- 下一篇: 在浏览器输入一个网址后,发生了什么?