本文是我大學兩年知識的總結。涵蓋數據結構、算法、語言基礎、操作系統、關系數據庫、NOSQL、網絡/前端/項目基礎知識、安全和測試、框架的學習、中間件和工具、設計模式和框架原理、我推薦的資料、我的建議
本篇文章應該算是Java后端開發技術棧的,但是大部分是基礎知識,所以我覺得對任何方向都是有用的。
?
1、數據結構
數據結構是計算機存儲、組織數據的方式。數據結構是指相互之間存在一種或多種特定關系的數據元素的集合。通常情況下,精心選擇的數據結構可以帶來更高的運行或者存儲效率。? ? ---摘自百度百科
?為什么把數據結構放在第一位呢?因為我認為這是一切的基礎。
比如
學了時間復雜度空間復雜度,你就能寫出更好的程序,解決更多的性能問題。
學了順序表和鏈表,你就知道,在查詢操作更多時,應該使用順序表,而在修改操作更多時,應該使用鏈表;
學了棧之后,你可能才能理解并寫出遞歸,學了隊列,會對消息隊列有一個認識,之后用輪子(比如kafka)才更得心應手。
學了串,你才知道String到底怎么實現的,你才知道了字符串如何匹配(KMP),搜索引擎(ES)是如何做出來。
學了排序,你才知道各種排序優缺點,知道各種語言的sort是如何實現的(別給我說就是快排),用到實際項目中。
學了哈希,你才可能讀懂HashMap是怎么玩的。
這是我做的一些總結:舊版總結
我進行了刪減,新寫的東西懶得加了。
涉及語言:
py3:注重算法本身的知識
c/c++:實現基礎數據結構和算法
java:實現較復雜數據結構
1.1、概述
? ? ? ? ? ? ? ? ? ? ? ??算法體系參考
? ? ? ? ? ? ? ? ? ? ? ??課上筆記1(復習c、課程概述)
? ? ? ? ? ? ? ? ? ? ? ??課上筆記2(基本概念、時空復雜度)
? ? ? ? ? ? ? ? ? ? ? ??時空復雜度
? ? ? ? ? ? ? ? ? ? ? ??淺析P/NP/NPC
? ? ? ? ? ? ? ? ? ? ? ??引入:算法優化
1.2、線性表
? ? ? ? 筆記:
? ? ? ? ? ? ? ? ? ? ? ??課上筆記3(線性表及順序表示)
? ? ? ? ? ? ? ? ? ? ? ??課上筆記5(鏈表概述)
? ? ? ? ? ? ? ? ? ? ? ??課上筆記6(鏈表選講、靜態鏈表)
? ? ? ? ? ? ? ? ? ? ? ??作業1講解(最大子數組二維多維)
? ? ? ? 基礎代碼實現:
? ? ? ? ? ? ? ? ? ? ? ??順序存儲實現(靜/動)
? ? ? ? ? ? ? ? ? ? ? ??單鏈表不帶頭(標準實現)
? ? ? ? ? ? ? ? ? ? ? ??單鏈表不帶頭(壓縮代碼)
? ? ? ? ? ? ? ? ? ? ? ??雙鏈表帶頭
? ? ? ? 應用:
? ? ? ? ? ? ? ? ? ? ? ??約瑟夫環(順序、鏈式、數學)
? ? ? ? ? ? ? ? ? ? ? ??線性表表示集合
? ? ? ? ? ? ? ? ? ? ? ??線性表表示一元多項式
? ? ? ? ? ? ? ? ? ? ? ??鏈表環相關問題
? ? ? ? ? ? ? ? ? ? ? ??鏈表coding能力練習:歸并排序
? ? ? ? ? ? ? ? ? ? ? ??LRU介紹和實現
? ? ? ? ? ? ? ? ? ? ??鏈表coding能力練習:相交問題
1.3、棧和隊列
? ? ? ? 筆記:
? ? ? ? ? ? ? ? ? ? ? ??課上筆記7(棧、隊列基礎)
? ? ? ? 基礎代碼實現:
? ? ? ? ? ? ? ? ? ? ? ??數組實現棧
? ? ? ? ? ? ? ? ? ? ? ??鏈表實現棧
? ? ? ? ? ? ? ? ? ? ? ??數組實現隊列(易懂實現循環)
? ? ? ? ? ? ? ? ? ? ? ??鏈表實現隊列
? ? ? ? ? ? ? ? ? ? ? ??雙棧
? ? ? ? ? ? ? ? ? ? ? ??棧和隊列的互相模擬
? ? ? ? 應用:
? ? ? ? ? ? ? ? ? ? ? ??棧排序
? ? ? ? ? ? ? ? ? ? ? ??括號匹配
? ? ? ? ? ? ? ? ? ? ? ??表達式求值
? ? ? ? ? ? ? ? ? ? ? ??簡單迷宮問題
? ? ? ? ? ? ? ? ? ? ? ??借漢諾塔理解棧與遞歸
? ? ? ? ? ? ? ? ? ? ? ??手動維護棧實現二叉樹三種遍歷
? ? ? ? ? ? ? ? ? ? ? ???深搜、廣搜與棧、隊列
? ? ? ? 相關算法:
? ? ? ? ? ? ? ? ? ? ? ??單調棧
? ? ? ? ? ? ? ? ? ? ? ??單調雙端隊列
? ? ? ? ? ? ? ? ? ? ? ??雙端隊列優化的背包問題
1.4、串
? ? ? ? 筆記:
? ? ? ? ? ? ? ? ? ? ? ??課上筆記8(串基礎)
? ? ? ? 基礎代碼實現:
? ? ? ? ? ? ? ? ? ? ? ??串的定長表示
? ? ? ? ? ? ? ? ? ? ? ??串的堆分配
? ? ? ? ? ? ? ? ? ? ? ??為何py整數不會溢出
? ? ? ? ? ? ? ? ? ? ? ??c語言文件操作
? ? ? ? 相關算法:
? ? ? ? ? ? ? ? ? ? ? ??一文讀懂KMP
? ? ? ? ? ? ? ? ? ? ? ??一文讀懂Manacher
? ? ? ? ? ? ? ? ? ? ? ??KMP題集1
? ? ? ? ? ? ? ? ? ? ? ??KMP題集2
? ? ? ? ? ? ? ? ? ? ? ??KMP+DP入門
? ? ? ? ? ? ? ? ? ? ? ??字符串上的動態規劃
? ? ? ? ? ? ? ? ? ? ? ??前綴樹
? ? ? ? ? ? ? ? ? ? ? ??后綴樹/后綴數組概述
? ? ? ? ? ? ? ? ? ? ? ??AC自動機
1.5、數組和廣義表
注:題目慢慢添加
? ? ? ? 筆記:
? ? ? ? ? ? ? ? ? ? ? ??課上筆記9(數組、廣義表)
? ? ? ? 部分題目實現:
? ? ? ? ? ? ? ? ? ? ? ??二維數組基操四連
? ? ? ? ? ? ? ? ? ? ? ??數組基本操作三連(1)
? ? ? ? ? ? ? ? ? ? ? ??數組基本操作三連(2)
? ? ? ? ? ? ? ? ? ? ? ??數組基本操作三連(3)
? ? ? ? ? ? ? ? ? ? ? ??數組基本操作三連(4)
? ? ? ? ? ? ? ? ? ? ? ??數組精選操作(5)
? ? ? ? ? ? ? ? ? ? ? ??數組精選操作(6)
? ? ? ? 應用:
? ? ? ? ? ? ? ? ? ? ? ??2048小游戲實現
? ? ? ? ? ? ? ? ? ? ? ??吃豆人
? ? ? ? ? ? ? ? ? ? ? ??貪吃蛇
1.6、樹
? ? ? ? 筆記:
? ? ? ? ? ? ? ? ? ? ? ??課上筆記10(樹和二叉樹概述)
? ? ? ? ? ? ? ? ? ? ? ??二叉樹概述
? ? ? ? ? ? ? ? ? ? ? ??課上筆記11(滿二叉樹、完全二叉樹)
? ? ? ? ? ? ? ? ? ? ? ??課上筆記12(二叉樹存儲與遍歷)
? ? ? ? ? ? ? ? ? ? ? ??課上筆記13(樹的存儲)
? ? ? ? 基礎代碼實現:
? ? ? ? ? ? ? ? ? ? ? ??理解二叉樹遍歷
? ? ? ? ? ? ? ? ? ? ? ??二叉樹序列化/反序列化
? ? ? ? ? ? ? ? ? ? ? ??先序中序后序兩兩結合重建二叉樹
? ? ? ? ? ? ? ? ? ? ? ??先序中序數組推后序數組
? ? ? ? ? ? ? ? ? ? ? ??直觀打印二叉樹
? ? ? ? ? ? ? ? ? ? ? ??根據數組建立平衡二叉搜索樹
? ? ? ? ? ? ? ? ? ? ? ??平衡二叉樹的判斷
? ? ? ? ? ? ? ? ? ? ? ??完全二叉樹的判斷
? ? ? ? ? ? ? ? ? ? ? ??搜索二叉樹的判斷
? ? ? ? ? ? ? ? ? ? ? ??二叉樹最長路徑
? ? ? ? ? ? ? ? ? ? ? ??時間低于O(N)求完全二叉樹結點個數
? ? ? ? 應用:
? ? ? ? ? ? ? ? ? ? ? ??二叉搜索樹
? ? ? ? ? ? ? ? ? ? ? ??堆
? ? ? ? ? ? ? ? ? ? ? ??堆應用例題三連
? ? ? ? ? ? ? ? ? ? ? ??并查集
? ? ? ? ? ? ? ? ? ? ? ??并查集入門題集
? ? ? ? ? ? ? ? ? ? ? ??線段樹
? ? ? ? ? ? ? ? ? ? ? ??樹狀數組
? ? ? ? 相關算法:
? ? ? ? ? ? ? ? ? ? ? ??最大搜索子樹
? ? ? ? ? ? ? ? ? ? ? ??morris遍歷 空間O(1)
1.7、圖
? ? ? ? 筆記:
? ? ? ? ? ? ? ? ? ? ? ??課上筆記14(圖基礎)
? ? ? ? ? ? ? ? ? ? ? ??課上筆記15(存儲、遍歷)
? ? ? ? 基礎:
? ? ? ? ? ? ? ? ? ? ? ??最小生成樹
? ? ? ? ? ? ? ? ? ? ? ??拓撲排序
? ? ? ? ? ? ? ? ? ? ? ??最短路
? ? ? ? 相關算法:
? ? ? ? ? ? ? ? ? ? ? ??迷宮
? ? ? ? ? ? ? ? ? ? ? ??棋盤簡單深搜廣搜
? ? ? ? ? ? ? ? ? ? ? ??皇后問題(位運算)
? ? ? ? ? ? ? ? ? ? ? ??旅行商問題(認識狀態壓縮)
1.9、查找
? ? ? ? 基礎代碼實現:
? ? ? ? ? ? ? ? ? ? ? ??二分及拓展
? ? ? ? ? ? ? ? ? ? ? ??二叉搜索樹實現
? ? ? ? ? ? ? ? ? ? ? ??數組建立二叉搜索樹
? ? ? ? ? ? ? ? ? ? ? ??自平衡二叉搜索樹
? ? ? ? ? ? ? ? ? ? ? ??AVL Tree
? ? ? ? 相關算法:
? ? ? ? ? ? ? ? ? ? ? ??HashMap記錄的動態規劃
? ? ? ? ? ? ? ? ? ? ? ??跳表介紹和實現
1.10、排序
? ? ? ? 基礎代碼實現:
? ? ? ? ? ? ? ? ? ? ? ??八種排序
? ? ? ? 相關算法:
? ? ? ? ? ? ? ? ? ? ? ??快排-荷蘭國旗
? ? ? ? ? ? ? ? ? ? ? ??快排-前m大元素
? ? ? ? ? ? ? ? ? ? ? ??歸并-求逆序數
? ? ? ? ? ? ? ? ? ? ? ??桶思想-相鄰數最大差值
? ? ? ? ? ? ? ? ? ? ? ??堆
? ? ? ? ? ? ? ? ? ? ? ??堆應用例題三連
? ? ? ? ? ? ? ? ? ? ? ??BFPRT
總之不要著急,基礎打牢。
1.10下面推薦一些學習資源:
1、數據結構 (嚴蔚敏,吳偉民編著圖書)
跟著經典走,絕對沒錯,這個書寫的真的不錯,里面的偽代碼你有能力自己實現一下。
2、大話數據結構
講的太入門了,看一遍對小白很有幫助
3、數據結構精講與習題詳解
另外一本經典書,是第一本的延申,有能力絕對要多看幾遍,寫的不錯。
?
二、算法
算法(Algorithm)是指解題方案的準確而完整的描述,是一系列解決問題的清晰指令,算法代表著用系統的方法描述解決問題的策略機制。也就是說,能夠對一定規范的輸入,在有限時間內獲得所要求的輸出。如果一個算法有缺陷,或不適合于某個問題,執行這個算法將不會解決這個問題。不同的算法可能用不同的時間、空間或效率來完成同樣的任務。一個算法的優劣可以用空間復雜度與時間復雜度來衡量。
先不說有沒有用(事實上工作上連leetcode知識用到的都不多),國內大廠面試筆試,算法是占很大部分的;國外(比如北美),更是刷leetcode就能進(我只是聽說的hhh)。
2.1ACM
首先關于ACM的建議:強校盡可能打一打吧,弱校除非很熱愛,否則不建議。
其中,強校指的是能穩定產出區域賽銀牌以上的學校。
如果在弱校,你可能舉步維艱:
首先我見過的,聽說過的一帶二的選手,最多也就區域銀,但是消耗了大量學習時間,還帶了兩個水貨拿牌子,這是很不值的。
其次,遇到某些讓你很難受的教練,可能你打了名額不讓你去,可能各種打壓你等等(競賽環境好的同學可能都想象不到吧)
當然,環境決定不了一切,如果你決定由你創造歷史,也是可以的,請你在大一就判斷一下:是否算法編程比賽比賽每次都第一,并且落下第二兩道題以上(反正要碾壓)?如果是的話,在考慮是否走這條路。(我大一就是這樣,但是其實p都不會)。
當然,你的學校如果有打ACM的那一群人,有一個集訓隊,非常建議加入他們,
第一,可以鍛煉自己。你不知道多少個日日夜夜為了調試一個bug在那里冥思苦想,你寫的代碼加起來可能有幾萬行(500題*30行=15000行,很正常吧),而這幾萬行代碼是你幾萬行業務代碼不能比的。
第二,這群人不一定是將來混得最好的人,但是一定是中上游的人,而讓這些人成為你的朋友,對你很有幫助。
第三,享受快樂,你ac的那種快感。
2.2推薦資源
這里我自己寫的ACM博客并不多,也不全,所以給你們點oj和板子合集。
新手推薦匡斌專題,刷完保銅沖銀絕對沒問題kuangbin專題合集
我推薦的,也是比較有名的一些oj
國內:(排名不分先后)
? ? 浙江大學(ZJU):http://acm.zju.edu.cn/? ? ? ? ? ? ?北京大學(PKU):http://acm.pku.edu.cn/JudgeOnline/
同濟大學(TJU):http://acm.tongji.edu.cn/? ? ? ? ? 杭州電子科技大學(HDU):http://acm.hdu.edu.cn/
吉林大學(jlu):http://acm.jlu.edu.cn/? ? ? ? ? ? ? ? 哈爾濱工程大學(hrbeu):http://acm.hrbeu.edu.cn/??
哈爾濱工業大學(HIT):http://acm.hit.edu.cn/? ? ? ? ? ? 北京郵電大學(Bupt):http://acm.scs.bupt.cn/onlinejudge/
汕頭大學(STU):http://acm.stu.edu.cn/? ? ? ? ? ? ? ? ? ? ? 福州大學(FZU):http://acm.fzu.edu.cn/
華中科技大學(HUST):http://acm.hust.edu.cn/JudgeOnline/? ? 華東師范大學(ECNU):http://acm.cs.ecnu.edu.cn/
國外:
? ? ? ?俄羅斯:烏拉爾大學(URAL):http://acm.timus.ru/? ? ? ? ? ? ?薩拉托夫大學(SGU):http://acm.sgu.ru/
美國:USACO: http://train.usaco.org/usacogate
波蘭:SPOJ:http://www.spoj.pl/
另外,基本各路模板我都有,可以找我要哈。
你也可以去洛谷,計蒜客等網站刷題,這些網站都對新手比較友好,是刷題的好去處。
?
2.3工作面試算法
?
不是每個人都會打acm,所以面向實際,性價比很重要,這里推薦《劍指offer》和leetcode。
其中,《劍指offer》肯定要看完并且理解,leetcode據說刷一百多道就能應付一般面試。
我本來想總結十篇精華帖,但是說實話leetcode題解絕對夠了。
https://leetcode-cn.com/
建議刷這幾個專題,性價比高一些哈。
動態規劃入門到熟悉,看不懂來打我啊(推薦)
搜索詳解
三、語言基礎
這不用我說,絕對是很重要的一部分,語言都學不明白,別的更不要想。你可以學習Java、c、c++、python、go等語言。
我主要是Java技術棧的,但是總結的基礎知識有一些不方便放出來,是我的私密文章,我只把一些公開的放出來。
3.1Java
1、一個".java"源文件中是否可以包括多個類(不是內部類)?有什么限制?
2、short s1= 1; s1= s1+1;?有沒有錯?3、short s1= 1; s1 += 1;有沒有錯?
4、使用final關鍵字修飾一個變量時,引用的內容一定不能變?
5、是否可以從static方法內對非static方法調用?為什么?
6、Overload和Override的區別?7、Overloaded的方法是否可以改變返回值的類型?
8、接口是否可繼承接口?抽象類是否可實現(implements)接口?抽象類是否可繼承具體類(concreteclass)?抽象類中是否可以有靜態的main方法?
9、Java中實現多態的機制是什么?10、abstractclass和interface有什么區別?
11、String s = "Hello";s = s + "world!";執行后,原始的String對象中的內容變了沒有?
12、下面這條語句一共創建了多少個對象:String s="a"+"b"+"c"+"d";
13、final, finally, finalize的區別。14、error和exception有什么區別?15、Java 中堆和棧區別
16、能將 int 強制轉換為 byte 類型的變量嗎?(引申到所有大類型轉小類型
17、hashCode有什么用?與 a.equals(b) 有什么關系?19,java中會存在內存泄漏嗎
這些問題以及更多問題都是我總結的比較好的問題,要答案去評論,我發。
想獲取更多筆記的。。。。。我不會給你們的hhhhh。
3.2Java一些總結
只有這些公開的了。
java 面向對象必懂概述
Arrays工具類常見方法
Collections 工具類常見方法
Java的IO總結
終于,我讀懂了所有Java集合——List篇? ? ? ? ??
終于,我讀懂了所有Java集合——queue篇
終于,我讀懂了所有Java集合——sort? ? ? ? ? ??
終于,我讀懂了所有Java集合——map篇
終于,我讀懂了所有Java集合——map篇(多線程)? ? ? ? ??
終于,我讀懂了所有Java集合——set篇
反射全解
關于Java中String的問題
3.3python:
python學習實例(1)
python學習實例(2)
python學習實例(3)
python學習實例(4)
python學習實例(5)
python學習實例(6)
python學習實例(7)
基礎技巧總結(一)?
基礎技巧總結(二)
基礎技巧總結(三)
基礎技巧總結(四)
基礎技巧總結(五)
為什么Python整型不溢出
另外,如果是零基礎py,我推薦廖雪峰的教程,百度搜即可。
?
3.4其它語言
哪種語言需要小白教程,評論,我給你想想有哪些好東西。
另外,py爬蟲建議學習一下。
四、操作系統
如果你時間緊,可以跳過。
操作系統是管理計算機硬件與軟件資源的計算機程序,同時也是計算機系統的內核與基石。操作系統需要處理如管理與配置內存、決定系統資源供需的優先次序、控制輸入設備與輸出設備、操作網絡與管理文件系統等基本事務。
4.1基礎知識
放下我的操作系統基礎知識總結
進程基礎
經典的進程同步問題
處理機調度?、虛擬存儲器
存儲器?
輸入輸出系統
文件管理
4.2具體實現
我認為學了最好可以把經典的算法都實現一下。
我模擬了一些。
模擬進程調度
模擬銀行家算法
模擬固定分區分配?
模擬基本分頁存儲
模擬動態分區分配
4.3jvm
如果你是Java技術棧,jvm是肯定要接觸的,這部分我也是小白,暫時沒怎么弄過jvm調優,但是知識一定要準備好,畢竟你學紅黑樹的時候也不知道將來寫TreeMap的時候有用呢?
Java內存模型常見問題
Java內存區域
如何判斷對象已經死亡
Hotspot虛擬機的對象
垃圾回收、垃圾收集器
空間分配
類加載過程、類加載器
堆和棧的精華大總結
4.4Linux
linux是人人都要會的。
我這部分其實很菜,基本上啥都不會,但是真的很重要。。。
我懶得找我總結的東西了,其實大部分就是一些命令的使用。
Linux概述
linux-在cenos上安裝大全(nginx/JRE/maven/Tomcat/MYSQL/redis/kafka/es...)
shell一文入門通
對于原理,我讀過一本書的小部分,后來因為各種原因沒有繼續讀下去,但是推薦給你們。
《linux內核設計與實現(第三版)》 拉夫,機械工業出版社的那本。
4.5多線程
比如Java多線程,這其實也是屬于操作系統只是的一部分,所以我放到了這里。
我這部分暫時沒有總結完。
總結了線程安全性的二十四個精華問題
volatile
synchronized使用和原理全解(((((推薦)))))
?
4.6推薦資源
基礎知識:
推薦王道考研的視頻,真的很贊,b站就可以搜得到。
優點:聲音好聽(有磁性)、學長總結(學生更容易聽懂)、不講廢話(節省時間)、講的通俗易懂(反正我一遍就懂)
我對比了不下五種視頻,這是最好的。
有的人可能會問我又不考研?那你不能看一遍?這么好的視頻不看多浪費啊?
多線程:
Java多線程編程核心技術(第2版) 作者:高洪巖
這本書我猶豫了很久到底要不要推薦呢?因為我看完了其實感覺一般,有些例子過于啰嗦,而且沒有底層原理的講解。但是用來入門的話,如果你是一個細心且耐得住性子的人,這本書還算不錯。
深入淺出Java多線程
這本書個人感覺比上一本好。但是還是看個人感覺吧,需要手把手教的那種,還是第一本好。
?
五、關系數據庫
開發離不開數據庫,我把數據庫的知識分為以下幾個階段:
5.1關系數據庫基本知識和任意一個語言實戰(MYSQL)
請注意,這是兩個事,前者我推薦數據庫系統概論,相信大部分學校的教材都是這本,里面的理論很重要,是基礎。
后者我推薦MySQL必知必會,這本書絕對是入門sql語言的最佳選擇。
這兩本書我不接受任何反駁,是相關方面國內最好的。
再推薦一個視頻:b站上面的東南大學徐立臻教授數據庫原理,真的講的很好,我看了不止一遍。
下面放下我的總結:
關系數據庫——基礎
關系數據庫——關系數據語言
關系數據庫——mysql數據類型大總結
關系數據庫——sql基礎1定義
關系數據庫——sql查詢
關系數據庫——sql增刪改
關系數據庫——mysql常用函數總結
關系數據庫——視圖/存儲過程/觸發器
關系數據庫——數據庫恢復
關系數據庫——并發控制
5.2有基本的優化能力,復雜的sql編寫能力
這部分我認為非常重要,實際工作中都是很復雜的sql,并且涉及到優化。
我推薦高性能MySQL(第二版),這本書說實話我讀不完,甚至只讀了十分之一,慚愧慚愧,但是還是讓我受益良多。
還有,推薦leetcode數據庫專題,真的也讓我受益良多(你們可能只知道leetcode算法吧hhhh)
5.3了解數據庫基本的實現原理
這里我推薦《MySQL技術內幕:InnoDB存儲引擎(第2版)》
5.4自己寫數據庫
我當然是沒達到的,但是我看到了很多大佬都在做這方面內容,包括本校的幾屆畢業薪資最高的學長、包括同級的外校大神,強行讓我做但是我不會啊。。。哭了
但是我想當推薦一下資源,我雖然沒實現,但是看了有很多收獲,如果你按著做出來了,完全可以當作一個不錯的項目。
推薦兩門網課:mit6.830 和 cmu15445(建議做前者的實驗(相對完整),看后者的課程)。
學完兩門網課之后,對數據庫系統已經有了大致的了解。
接下來可以看數據庫系統概念(但是這本書寫的有點繁瑣),推薦看pingcap的tidb源碼閱讀二十四篇(https://pingcap.com/blog-cn/),看文章的時候可以看一下源碼(需要學一下go)。
另外一個好的學習資源是talent plan,作業質量挺高的。
(https://university.pingcap.com/)
如果你對pingcap的tidb很感興趣,想繼續深入學習,可以再了解一下分布式,推薦mit 6.824,接下來就是看論文,寫lab的快樂時光,接著你可能想看看tikv,那么可以學一下rust啦。
?
六、NOSQL
?
內存越來越快、越來越便宜的今天,你要是不會一個nosql那可以不用干活了吧?
但是簡單地用當然不夠(你會用map就會用nosql),你最好知道一下復雜的操作,和nosql的原理。
我這里研究的是redis:
6.1入門
Redis是一款基于鍵值對的NoSQL數據庫,它的值支持多種數據結構:
字符串(strings)、哈希(hashes)、列表(lists)、集合(sets)、有序集合(sorted sets)等。
? Redis將所有的數據都存放在內存中,所以它的讀寫性能十分驚人,用作數據庫,緩存和消息代理。
Redis具有內置的復制,Lua腳本,LRU逐出,事務和不同級別的磁盤持久性,并通過Redis Sentinel和Redis Cluster自動分區提供了高可用性。
? Redis典型的應用場景包括:緩存、排行榜、計數器、社交網絡、消息隊列等
NOSQL及redis概述
但是我們實戰之前,還是要了解基本使用
數據結構和對象的使用介紹
Java整合
6.2原理總結
這部分在我看來是最有意思的,我們有必要了解底層數據結構的實現,這也是我最感興趣的。
比如,你知道redis中的字符串怎么實現的嗎?為什么這么實現?
你知道redis壓縮列表是什么算法嗎?
你知道redis為什么拋棄了紅黑樹反而采用了跳表這種新的數據結構嗎?
你知道hyperloglog為什么用如此小的空間就可以有這么好的統計性能和準確性嗎?
你知道布隆過濾器為什么這么有效嗎?有沒有數學證明過?
你是否還能很快寫出來快排?或者不斷優化性能的排序?是不是只會調庫了甚至庫函數怎么實現的都不知道?真的就是快排?
包括數據庫,持久化,處理事件、客戶端服務端、事務的實現、發布和訂閱等功能的實現,也需要了解。
另外,
數據結構(字典、鏈表、字符串)
數據結構(整數集合,壓縮列表)
數據結構(跳表介紹和手撕)
為什么選擇了跳表而不是紅黑樹?
HyperLogLog
LRU介紹和實現
Redis中的LRU算法改進
布隆過濾器
qsort源碼
對象(字符串對象、列表對象、哈希對象、集合對象、有序集合總結)
內存管理
數據庫簡介、數據持久化
事件
客戶端、命令的執行過程
事務
發布和訂閱
6.3多機
舊版復制
新版復制
哨兵機制
6.4實戰
進一步的了解了redis的使用和原理,我們來寫一些簡單的實戰代碼
實戰點贊
實戰關注
緩存擊穿/穿透/雪崩
對項目的一些優化方案
RedLock
6.5更多的細節問題
相關問題匯總
?
七、網絡/前端/項目基礎知識
7.1網絡原理
只要是開發肯定離不開網絡知識。
HTTP
響應代碼全集
網絡原理知識點匯總
網絡原理知識點總結
但是我不建議你把那本《計算機網絡(第七版)謝希仁著》看完,我感覺太過無聊而且底層的那幾層我個人感覺是真的用處不大。
推薦書籍:《計算機網絡:自頂向下》、《圖解http》
7.2前端基礎
除非你可以牛到給老板說:“老子就是不會前端,專做后端”,否則你還是要會一些前端的。
Java開發需要知道的HTML知識
js知識點匯總
jquery選擇器
建議上vue\react\node.js,這些是我問的前端同學的建議。
如果時間不夠上面的知識,bootstrap建議看一下(因為我就會一點hhhh)
?
7.3項目基礎知識
不同于基礎語言知識,這部分知識可能涉及到網絡方面知識,學會后你可以具體做一些東西比如Java,你就需要學servlet、JDBC等JavaEE技術,但是這些技術又不會真的工作用,只是基礎,但是真的很重要,建議拿這些知識寫一些項目,比如學生管理系統。
Java網絡編程
AJAX大總結
servlet基礎總結
servlet中的數據存儲
servlet——三兄弟的另外兩個:過濾器/監聽器
mysql——JDBC
但是我不建議你再學JSP,這都9102年了,為啥非抱著它不放呢?你學leaf不好嗎?如果說servlet、JDBC是基礎,我覺得jsp真的沒必要,他也不是什么所謂的“基礎”。
?
八、安全和測試
這部分我覺得也是很值得學習的,反向思維很重要,不要以為開發就可以不懂測試,不懂安全。
咱們寫代碼的時候也是邊寫邊側不是么。
說一下我學這些的理由:
壓測的話,LoadRunner太不方便,太過于龐大,可能專業測試需要學,開發學jmeter就可以啦。
安全方面其實我挺有感觸的,你們知道為啥要放驗證碼嗎?你們知道SpringSecurity是咋實現的嗎?你們知道xss,sql注入,文件上傳漏洞,瀏覽器安全,這些東西怎么攻擊怎么防御嗎?
我們作為開發其實是需要知道的吧。
軟件測試基礎知識
探索式軟件測試
壓力測試Jmeter
安全方面知識
常見漏洞
?
九、框架的學習
Java來說,學完了JavaEE肯定要學框架的,你總不能拿servlet和jsp、JDBC寫項目吧?
推薦ssm,不要學ssh了,都9102年了,咱們就不要浪費時間了。
springboot是一定要學的,相關的spring生態圈都要學,這部分我也剛接觸,以后要多多學習。
springboot——概述
springboot1——spring相關入門
springboot2——MyBatis入門
springboot-攔截器
springboot——kaptcha
springboot3——Email
Spring Security使用
至于原理,抱歉我能力有限,目前正在學習中。。。。。。。。。。。。。。。
?
十、中間件和工具
?
這一部分我暫時沒怎么寫總結博客,但是我認為都是要會用并且了解原理的。
推薦的鏈接有幾篇是其他人寫的,因為我也是小白,有的方面沒什么經驗。
10.1消息隊列
這是必會內容,否則你寫的項目可以說沒有什么性能可言吧。
首推kafka,當然你學別的未嘗不可,就算拿redis也能寫,看你自己的需要吧。
建議學習原理,我覺得挺重要的。
真的,Kafka 入門一篇文章就夠了
10.2搜索引擎
這我認為不是必會的,但是最好學習一下,推薦你可以自己基于字典樹做一個小型搜索引擎,還可以統計熱點詞、過濾敏感詞等等,非常方便。
至于具體的我推薦elasticsearch,并且我建議原理一定要了解一下,什么倒排索引之類的。
10.3本地緩存
現在光會關系數據庫肯定是不行的,你要會一種nosql數據庫,你要做緩存,提升性能,,但是進一步提高性能,預防緩存問題(比如緩存雪崩),你就需要做多重緩存,本地緩存是少不了的。我推薦咖啡因。
10.4git
不多解釋,就是給你提個醒。
教程推薦廖雪峰
git大總結
10.5 maven
這個也是必學內容,小白的直觀感受就是可以不用到處搜jar包了。還有很多其他強大的功能。
Maven項目對象模型(POM),可以通過一小段描述信息來管理項目的構建,報告和文檔的項目管理工具軟件。
Maven 除了以程序構建能力為特色之外,還提供高級項目管理工具。由于 Maven 的缺省構建規則有較高的可重用性,所以常常用兩三行 Maven 構建腳本就可以構建簡單的項目。由于 Maven 的面向項目的方法,許多 Apache Jakarta 項目發文時使用 Maven,而且公司項目采用 Maven 的比例在持續增長。
手把手maven的功能/安裝/使用/idea集成
10.6nginx
沒有商量,必須會。
Nginx是一款輕量級的Web?服務器/反向代理服務器及電子郵件(IMAP/POP3)代理服務器,在BSD-like 協議下發行。其特點是占有內存少,并發能力強,事實上nginx的并發能力在同類型的網頁服務器中表現較好,中國大陸使用nginx網站用戶有:百度、京東、新浪、網易、騰訊、淘寶等。
nginx學習,看這一篇就夠了
10.7 zookeeper
必會,關鍵你kafka啥的都得在這上面跑。
ZooKeeper是一個分布式的,開放源碼的分布式應用程序協調服務,是Google的Chubby一個開源的實現,是Hadoop和Hbase的重要組件。它是一個為分布式應用提供一致性服務的軟件,提供的功能包括:配置維護、域名服務、分布式同步、組服務等。
ZooKeeper的目標就是封裝好復雜易出錯的關鍵服務,將簡單易用的接口和性能高效、功能穩定的系統提供給用戶。
ZooKeeper包含一個簡單的原語集,?[1]??提供Java和C的接口。
持續更新的Zookeeper知識總結
10.8 idea
必會
idea常用設置
10.9vim
必會
vim特別好的教程
10.10dubbo
dubbo知識點總結 持續更新
10.11Xmind/ProcessOn
- Xmind官網地址:?https://www.xmind.cn
- ProcessOn在線作圖地址:https://www.processon.com
我這里列舉了兩個工具,他們兩個都可以做概要設計的腦圖
10.12Postman
- 官網地址 :https://www.getpostman.com
這個是接口調試的神器,單測比較繁瑣的你可以試試這個嘛,不過很多接口還是只能寫寫單測,反正很香。
不過這個名字一看就是男生用的,那我們女生用啥呢?往下看
10.13Postwoman
官網地址 :https://postwoman.io
PostMan一聽就是男生用的,咋妹子們肯定要用最近開源的Postwoman啊,它是一款開源的 Postman 替代品
開源沒多久優點如下:
輕盈,可直接在線訪問;
簡約,采用簡約的 UI 設計精心打造;
支持 GET, HEAD, POST, PUT, DELETE, OPTIONS, PATCH 方法;
支持驗證;
實時,發送請求即可獲取響應。
10.14Gradle
官網地址 :https://gradle.org
Gradle是一個基于Apache Ant和Apache Maven概念的項目自動化構建開源工具。
它使用一種基于Groovy的特定領域語言(DSL)來聲明項目設置,目前也增加了基于Kotlin語言的kotlin-based DSL,拋棄了基于XML的各種繁瑣配置。
這個跟Maven功能是一樣的,但是兩者語法不一樣,而且我覺得版本控制的時候沒Maven好使,有小坑,勝在語法簡潔。
?
十一、設計模式和框架原理
當你開發到一定程度,學習設計模式肯定是避免不了的
建議閱讀經典書籍,這是筆記,我覺得看筆記也可以。
《Head First設計模式》讀書筆記_第一章
《Head First設計模式》第二章筆記 觀察者模式
《Head First設計模式》第三章筆記 裝飾者模式
《Head First設計模式》第四章筆記 工廠模式
《Head First設計模式》第五章筆記-單件模式
《Head First設計模式》第六章筆記-命令模式
《Head First設計模式》第七章-適配器模式、外觀模式
《Head First設計模式》第八章筆記-模板方法模式
《Head First設計模式》第九章(1)迭代器模式
《Head First設計模式》第九章(2)組合模式
《Head First 設計模式》第十章-狀態模式 狀態模式
學了設計模式你才敢去看源碼。
至于spring源碼,我畢竟還年輕,寫代碼太少,沒勇氣去看(也沒能力去看),以后再說吧。
?
十三、我推薦的資料
文中提到的書和視頻我都是看過的,不會只聽說過就推薦給你,那是不負責任。
1、數據結構 (嚴蔚敏,吳偉民編著圖書)
跟著經典走,絕對沒錯,這個書寫的真的不錯,里面的偽代碼你有能力自己實現一下。
2、大話數據結構
講的太入門了,看一遍對小白很有幫助
3、數據結構精講與習題詳解
另外一本經典書,是第一本的延申,有能力絕對要多看幾遍,寫的不錯。
推薦《劍指offer》和leetcode。
其中,《劍指offer》肯定要看完并且理解,leetcode據說刷一百多道就能應付一般面試。
我本來想總結十篇精華帖,但是說實話leetcode題解絕對夠了。
https://leetcode-cn.com/
Java多線程編程核心技術(第2版) 作者:高洪巖
這本書我猶豫了很久到底要不要推薦呢?因為我看完了其實感覺一般,有些例子過于啰嗦,而且沒有底層原理的講解。但是用來入門的話,如果你是一個細心且耐得住性子的人,這本書還算不錯。
深入淺出Java多線程
這本書個人感覺比上一本好。但是還是看個人感覺吧,需要手把手教的那種,還是第一本好。
《計算機網絡:自頂向下》、《圖解http》
總:
Stack Overflow,https://stackoverflow.com/questions/tagged/java
Stack Overflow 可以說是解決問題的殺手锏
嗶哩嗶哩
上邊的視頻都是非常高質量的,你可以去搜索看一下。
慕課網
雖然有些視頻時付費的,但是質量是真的高,那些免費的入門足夠看了
菜鳥教程
一聽名字就知道適合菜鳥的,但是基礎的知識寫的非常詳細,很清晰易懂,非常適合剛開始學習編程的小伙伴。
W3School
剛開始學WEB開發時,經常結合w3school學習前端,開發時,如果遇到記不清的標簽,就去w3school搜索。
中國大學MOOC
如果你是非科班的,想要系統著補某們大學的課程,那么中國大學MOOC是個不錯的選擇,這里有各種各樣的課程,有些老師還是講的挺好了,和大學課程老師的教學差不多。我編譯原理就是在這里學到.
?
第零、最后,我的建議
0.1不要飄
永遠保持一顆謙虛的心,你認為你厲害或者你很努力是因為你的環境不好而已。
在一個中專,你會寫項目,能寫增刪改查,就覺得自己特別努力特別厲害。
在一個三本院校,你可能天天按時上課,就覺得自己特別努力特別厲害。
在一個一本院校,你可能覺得上課好好聽講,下課好好寫作業,就覺得自己特別努力特別厲害。
在一個211,你可能沒課的時候也去圖書館,并且課下時間對老師講的東西做了一些拓展,就覺得自己特別努力特別厲害。
在一個985.。。。。。
還用繼續說嗎?你認為的努力和厲害,換個環境,毛都算不上。驕傲的人必定失敗
?
0.2不要慌
很多人焦慮找不到好工作,我也是。
我見過省會城市一個挺大的當地企業,四五十平米的屋子擠著幾十個人,每個程序員在自己的一平米空間里工作,月薪2500.
我見過清華的,手寫操作系統運行在自己做的cpu上,手寫數據庫,oi省一、數雙學位、一天速成java寫了個app拿了第一,GPA大部分4.0。
人和人的差距,比人和狗的差距還大。
所以不要慌,你再慌,也有人不如你,你再慌,也有人比你厲害。
一步一步走,永遠不要被別人影響,做好自己。
0.3不要猶豫
挺多人還在比那個語言好,糾結學哪個語言,糾結哪個方向掙錢。
想的多不如去做,我相信不管你做什么,只要努力一定有收獲。
0.4我不建議花時間學的東西
AWT 和 Swing
好像不知道大清朝早已經亡了幾百年一樣。已經 9102 了,誰還會用 AWT 和 Swing 去開發桌面應用呢?
Struts
Struts 是早年一個優秀的 MVC 框架,單從技術的角度來看,還是蠻不錯的。但是自從有了 SpringMVC 后,Struts 就被拍死在沙灘上了。
Hibernate
Hibernate 太重量級了,學習成本太高,取而代之的是輕量級的 MyBatis(支持定制化 SQL、存儲過程以及高級映射)。
JSP
等等。。。
當然誰和誰的情況都不一樣,如果你入職的小公司確實需要,還是要學的(但是我建議你跑路,沒意義的)