假如有那么殘酷的一天,我不小心喝錯了一瓶藥,一下子抹掉了我這十多年的編程經驗,把我變成了一只小白,我想自學 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 上發現了一個寶藏專案,光看了一下目錄,就有點吸引我,需要的小伙伴可以按需自取,地址如下所示:
https://github.com/itwanger/JavaBooks
05、第五個階段,活著最重要
技術是沒有終點的,也是學不完的,最重要的是活著、不禿,
零基礎入門的時候看書還是看視頻,我覺得成年人,何必做選擇題呢,兩個都要,喜歡看書就看書,喜歡看視頻就看視頻,
最重要的是在自學的程序中,一定不要眼高手低,要實戰,把學到的技術投入到專案當中,解決問題,之后進一步錘煉自己的技術,
開源的專案我推薦 GitHub 上的 mall 和 vhr,前者是電商系統,后者是微人事,都用的最前言的技術,并且檔案很全面,不怕暈頭轉向,
自學最怕的就是缺乏自驅力,一定要自律,杜絕“三天打魚兩天曬網”,到最后白忙活一場,
高度自律的同時,要保持耐心,不拋棄不放棄,切勿自怨自艾,每天給自己一點點鼓勵,學習的勁頭就會很足,不容易犯困,
技術學到手后,找作業的時候一定要好好準備一份簡歷,不要無頭蒼蠅一樣去海投簡歷,容易“竹籃打水一場空”,可以參考下面的鏈接,好好的準備一下簡歷,畢竟是找作業的敲門磚,
入職阿里后,才知道原來簡歷這么寫
拿到面試邀請后,在面試的程序中一定要大大方方,盡力把自己學到的知識舒適地表達出來,不要因為是自學就不夠自信,給面試官一個好的印象,面試成功的幾率就會大很多,加油吧,騷年!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/169627.html
標籤:Java
上一篇:知識點:讓編程學習者們又愛又恨的指標基礎,為你詳解(二)
下一篇:如何優雅的停止一個執行緒?
