java 概述进阶
作者:沉默王二
鏈接:https://www.zhihu.com/question/267403723/answer/1520053322
來源:知乎
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
假如有那么殘酷的一天,我不小心喝錯了一瓶藥,一下子抹掉了我這十多年的編程經驗,把我變成了一只小白。我想自學 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)基本數據類型
8 種基本數據類型(boolean、char、byte、short、int、long、float、double)
整形中 byte、short、int、long 的取值范圍
單精度和雙精度
為什么不能使用“==”比較浮點數
基本類型和包裝類型的區別
自動拆箱與裝箱
Integer 的緩存機制
2)操作符
算術運算符
邏輯運算符
比較運算符
3)流程控制語句
條件分支(if/else/else if、三元運算符、switch)
循環或者遍歷(for、while、do-while)
break 和 continue
4)包
創建包
導入包
包全名
5)main 方法詳解
public 關鍵字
static 關鍵字
void 關鍵字
main 方法
字符串數組參數(String[] args)
6)數組
什么是數組?
訪問數組
遍歷數組
打印數組
可變參數
數組排序
數組轉成 Stream
數組轉成 List
數組搜索
java.util.Arrays
數組越界
7)注釋
單行注釋
多行注釋
文檔注釋
注釋真的不會被執行嗎?
優秀的程序員真的不寫注釋嗎
8)字符串
雙引號字符串和 new 字符串對象
字符串為什么是不可變的?
String、StringBuilder 和 StringBuffer 之間的區別
字符串拼接的幾種方式
字符串常量池
關于 intern
字符串比較(== 和 equals)
字符串拆分
字符串操作小技巧
字符串轉整形
生成 UUID(多謝知友的提醒,鏈接已更新)
字符串可以引用傳遞嗎?
字符串長度
關于 substring
03、第三個階段,Java 核心技術
1)面向對象
面向對象和面向過程
封裝
繼承
多態
接口
抽象類
重寫和重載
構造方法
局部變量、成員變量、靜態變量、常量
值傳遞還是引用傳遞
final 關鍵字
this 關鍵字
super 關鍵字
不可變對象
equals() 和 hashCode()
打印 Java 對象
NullPointerException
2)常用工具類
字符串相關的工具類
日期時間相關的工具類
枚舉
隨機數
正則表達式
Apache-commons 工具庫
Guava 工具庫
3)集合框架
ArrayList
LinkedList
ArrayList 和 LinkedList 之間的區別
不可變 List
CopyOnWriteArrayList
HashMap
LinkedHashMap
TreeMap
ConcurrentHashMap
fail-fast
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)泛型
什么是泛型?
類型擦除
泛型帶來的問題
泛型中 K T V E 這些特殊字幕的含義
通配符
上下界限定符 extends 和 super
不要在集合中使用 Java 原始類型
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 新特性
Lambda 表達式
Stream流
Optional
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
讀寫分離
數據庫緩存(Redis、MongoDB)
數據庫中間件(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)消息隊列
RabbitMQ
Kafka
12)容器
Docker
K8s
需要 Java 書單的話,我在 GitHub 上發現了一個寶藏項目,光看了一下目錄,就有點吸引我。
需要的小伙伴可以按需自取,地址如下所示:
itwanger/JavaBooks
還有小伙伴說有沒有同步到碼云,我也搞來了:
沉默王二/JavaBooks
05、第五個階段,活著最重要
技術是沒有終點的,也是學不完的,最重要的是活著、不禿。
零基礎入門的時候看書還是看視頻,我覺得成年人,何必做選擇題呢,兩個都要。喜歡看書就看書,喜歡看視頻就看視頻。
最重要的是在自學的過程中,一定不要眼高手低,要實戰,把學到的技術投入到項目當中,解決問題,之后進一步錘煉自己的技術。
開源的項目我推薦 GitHub 上的 mall 和 vhr,前者是電商系統,后者是微人事,都用的最前言的技術,并且文檔很全面,不怕暈頭轉向。
自學最怕的就是缺乏自驅力,一定要自律,杜絕“三天打魚兩天曬網”,到最后白忙活一場。
高度自律的同時,要保持耐心,不拋棄不放棄,切勿自怨自艾,每天給自己一點點鼓勵,學習的勁頭就會很足,不容易犯困。
技術學到手后,找工作的時候一定要好好準備一份簡歷,不要無頭蒼蠅一樣去海投簡歷,容易“竹籃打水一場空”。可以參考下面的鏈接,好好的準備一下簡歷,畢竟是找工作的敲門磚。
入職阿里后,才知道原來簡歷這么寫
總結
- 上一篇: Inmon和Kimball数仓建模思想
- 下一篇: 在浏览器输入一个网址后,发生了什么?