凌晨起来肝的一篇 Java 学习路线,保证学弟学妹们大三大四的时候顺利找到实习 Offer
大家好,我是二哥呀!
13 年 Java 編程經驗的老油條了,拒絕過阿里,在日企搬磚過 5 年,Java 領域的優質創作者,說實話,如果是單純奔著實習 Offer 去的話,還是不難的。
說句挺不好意思的話,上學和剛參加工作那會,我一直傻乎乎的認為,只要把 Java 吃透的話就可以了,直到近些年我才恍然大悟,我的認知是有缺陷的。想從事 Java 后端開發工作,需要從以下 5 個方面做起,找到實習 Offer 絕壁不是問題。
- C 程序設計語言,為什么學 Java 要學 C 語言呢?這也是我最近才想明白的一個問題,因為 C語言是其他編程語言的母胎,包括 Java,不少同學感覺自己學 Java 很吃力,原因可能就在這,沒有把根基打好。
- 數據結構與算法,清華大學的鄧俊輝教授曾說過這樣一句話,數據結構作為構建高效算法的必要基礎,在計算機科學領域中,起到了技術體系基石的作用。而算法呢?又是面試的必考內容,在國外,甚至可以只刷算法題就能拿到大廠的 Offer,這里給大家推薦一份純 Java 版的 LeetCode 刷題筆記,美團技術大佬寫的,主力編程語言是 Java 的同學可以借鑒下,刷題的幸福指數會提高很多:刷完 300 道 LeetCode 題后,我膨脹到要飄起來了!純正 Java 版
- 計算機組成原理,這方面知識比較扎實的話,學妹再找你裝機修電腦的話,可以說輕松搞定。計算機是由 CPU、內存、顯示器這些設備組成的硬件,但我們大學畢業后,往往從事的是軟件方面的開發工作。那怎樣才能在硬件和軟件之間自由穿梭呢?答案就是學好計算機組成原理。弄明白了計算機的組成原理,也就對整個軟件開發有了一個系統的認知,不論是計算機的硬件原理,還是軟件架構,都能很好的駕馭,隨之而來的,我們的職業發展機會也就更多了。
- 計算機操作系統,為什么要學習計算機操作系統?第一,面試要考,第二,無論學習哪門子編程語言,比如說 Java、C/C++,都需要和操作系統打交道,像 Java 中的多線程技術,其實是由操作系統來負責進程和線程管理的;第三,學習操作系統,還能學到內存分配方面的知識。
- 計算機網絡,又是一塊面試經常被問到的知識點,什么 TCP 為什么三次握手?四次揮手?TCP 為什么是可靠傳輸協議,而 UDP 不是?鍵入網址到網頁顯示,期間發生了什么?HTTPS 握手過程是怎樣的?
- Java 源碼,我大學時期有一個很牛逼的同學,基本上我們遇到的問題在他那都能搞得定,我問他有什么秘訣嗎?他的答案很簡答,看 Java 源碼啊!確實,面試的時候,像 HashMap 這種源碼級別的知識點,基本上是必問項目。
我之前整理過一個 Java 工程師進階之路的大綱思維導圖,這里貼出來大家圍觀下(參考自 hollis 的成神之路)。
當然了,這只是 Java 后端體系的鳥瞰圖,校招的時候,不會要求上面的這些知識點全部都得掌握,像設計模式這塊,通常需要大量的實戰經驗才能運用得恰到好處,學生階段,往往項目經驗比較缺乏,所以這部分內容在大學的時候往往沒辦法施展拳腳。
我之前曾分享過這么一個觀點,假如有那么殘酷的一天,我不小心喝錯了一瓶藥,一下子抹掉了我這十多年的編程經驗,把我變成了一只小白。我想自學 Java,并且想要找到一份工作,我預計需要 6 個月的時間,前提條件是每天都處于高效率的學習狀態當中,并且每天的學習時間至少在 12 個小時以上。
現在回頭再評估下,發現這個觀點依然是成立的。
如果大學階段,學校開設了數據結構與算法、計算機操作系統、計算機網絡、C語言程序設計這些基礎課程的話,其實學起來會更快一點。
對于那些轉專業的同學來說,如果時間比較緊迫的話,可以直接上手 Java,等到拿到了實習 Offer 后再把這些基礎補一補我認為也是可以的。但這種情況下,就必須在找工作前很刷面試題和算法題了,通過強化突擊彌補自己在計算機基礎知識方面的短板。
我認識這樣一些同學,是真事,初中高中階段就對編程很感興趣,在興趣的驅使下很早的就有了編程的基礎。我之前就認識這么一位小妹妹,初中的時候學習成績特別好,直接保送到北航的一所直屬高中,不是搞衛星就是搞航天模型,立志以后做一名黑客。
對于這些未來潛在的技術大佬,她們學什么都會特別快,因為論語里不是有一句話嘛,“知之者不如好之者,好之者不如樂之者”!
一、Java 基礎
關于 Java 基礎篇的學習,我這有一份 GitHub 上標星 115k 的 Java 教程:包括 Java 核心、Java 集合框架、Java 并發編程、 Java IO,非常全面,是我花了一周多時間手工整理的,非常辛苦,大家一定要珍惜。
太贊了,GitHub 上標星 115k+ 的 Java 教程
?
你也可以選擇看書,我推薦《Java 核心技術卷》,分為上下兩冊,上冊的難度較低,可以在短時間內刷完。下冊涉及到的內容有流與文件(☆)、XML、網絡(☆)、數據庫編程、國際化、Swing、AWT、JavaBean、安全(☆)、腳本編譯和注解處理、分布式對象、本地方法(☆),沒有標星的內容我認為可以略過。
然后再看一看《Java 編程思想》,看自己是否能駕馭得了。因為思想的東西嘛,只有經過一些實踐后才能有所感悟,否則就像王陽明一開始對著竹子格物一樣,屁也格不出來,有了后面領軍作戰的經驗,以及到地方上體驗艱苦生活的感受后就開創了心學。
視頻的話,可以看一下浙江大學教授翁愷老師的。在浙大,每年最受關注的內容之一就是永平獎的百萬大獎會花落誰家。2018 年,獲得永平杰出教學貢獻獎的人,就是翁愷教授。
https://www.bilibili.com/video/BV1DJ411B7cG?p=3
?
翁愷教授可以說是浙大的網紅教授,非常受歡迎,網絡上各種風評都很不錯。
我來列一下 Java 基礎部分要掌握的知識點吧,可以按照這個順序來學習,每學完一部分就打卡下。
初學階段,強烈建議大家把書本上、視頻上的代碼都敲一遍。由于不像工作后,有大量的項目可以實踐,所以不能得到及時的反饋,記筆記就顯得特別的重要。另外,一定要分門別類保存好自己的 demo,以便以后可以快速得找得到,尤其是一些小套路,會很有用,積累得多了,可能就變成了自己的工具庫。如果還有精力的話,可以把自己的學習心得分享出來,發表到博客上。
我之前就記了蠻多筆記的。像下面這些基礎到不能再基礎的知識點,我都有重新去學,并且嘗試用自己的方式把這些知識點表達清楚。就這樣不斷的分享,不斷的積累,我好像才真有點清醒的感覺。
什么是面向對象編程(OOP)?
為什么要將局部變量的作用域最小化?
Java到底是值傳遞還是引用傳遞?
如何比較 Java 的字符串?
再談 Java 的繼承和超類 Object
Java Serializable:明明就一個空的接口嘛
Java Socket:飛鴿傳書的網絡套接字
Java 網絡編程:必知必會的 URL 和 URLConnection
Java面試官:兄弟,你確定double精度比float低嗎?
請用面向對象的思想,談一談這次面試的過程
Java:接口和抽象類,傻傻分不清楚?
Java生成二維碼分享海報
Java:優雅地處理異常真是一門學問啊!
教妹學 Java:晦澀難懂的泛型
教妹學Java:大有可為的集合
教妹學 Java:難以駕馭的多線程
Java 的核心目的和并發編程
Java:程序不過是幾行代碼的集合
如何理解 Java 中的繼承?
吃人的那些 Java 名詞:對象、引用、堆、棧
Java 的操作符——“=”號
害死人的自動遞增,不償命的自動遞減
Java 流程控制語句
Java是通過什么機制來確保對象初始化呢?
Java 訪問權限控制:public、private、protected
Java代碼復用的三種常用方式:繼承、組合和代理
Java:多態乃幸福本源
Java String,看這篇就夠了
Java 數組,看這一篇就夠了
HashMap,難的不在Map,而在Hash
Java枚舉:小小enum,優雅而干凈
Java注解(Annotation):請不要小看我!
Java I/O 入門篇
Java:并發不易,先學會用
我給學弟學妹們提供這樣一個思路。
首先,我們需要一個思維導圖(我一開始貼出來的那副),順藤摸瓜,看看都有哪些知識點需要學習。
然后,我們不斷地細分,切入這些零散的知識點,從書中、視頻中、博客中找答案,吸收。
再然后,我們嘗試按照自己的思考方式去分享這些知識點,不怕丟人,勇敢地做分享,力求讓自己教會別人。
最后,和他人進行溝通,再通過實踐去檢驗自己的學習成果。
這一套下來,不能說編程上有了突飛猛進,至少可以能突破瓶頸。
二、Java 框架
這部分也可以叫做 JavaWeb,但我更傾向于把這部分叫做 Java 框架,因為 JavaWeb 最初要學習的東西是 JSP,Servlet 這些東西,都已經被淘汰了,再去學這些知識只會浪費時間。有了大佬推薦了這部分內容,說 Spring 的那些系列框架也只是圍繞這些知識點展開的,有一定的道理,但還是不太建議把時間花到這部分知識點上,要知道,技術是要更新換代的,好鋼用在刀刃上。
做 Web 開發,是會涉及到前端的一些知識點的,尤其是在練手階段,不會像進公司后一個蘿卜一個坑,只負責后端或者只負責前端,往往需要全棧,但想從事 Java 后端開發的話,前端這些知識點還是盡量少花時間,盡量在練手階段找同學合伙做項目,不要把自己搞成一個全棧,前端也是很累的一個活,需要時間的。
前端技術蠻多的,我舉幾個常見的,比如說:
- Vue,前端框架
- Vue-router,路由框架
- Vuex,全局狀態管理框架
- Ant Design Vue,前端 UI 框架
- Axios,前端 HTTP 框架
這還不包括 JavaScript+HTML+CSS 在內。
所以,學弟學妹們明白我的意思嗎?如果一心想從事 Java 后端開發,盡量找喜歡前端的同學配合一起做練手項目,不僅能鍛煉團隊配合的默契,還能讓自己有充分的時間學習更深度的 Java 后端技術。
從事 Java 后端開發的話,自然也就離不開 Spring 的系列框架。Spring 框架早已成為 Java 后端開發事實上的行業標準,如何用好 Spring ,也就成為 Java 程序員的必修課之一。同時,Spring Boot 和 Spring Cloud 的出現,可以幫助 Java 程序員更好地基于 Spring 框架及各種基礎設施來快速搭建系統,可以說,它們的誕生又一次解放了Java 程序員的生產力。
所以,Spring Boot 和 Spring Cloud 已成為 Spring 生態中不可或缺的一環。想成為一名合格的 Java 后端工程師,Spring Framework、Spring Boot、Spring Cloud 這三者必須牢牢掌握。
首先來學 SSM(Spring+SpringMVC+MyBatis,企業級應用的必須品)的整合教程,哪怕是已經有了 Spring Boot,SSM 仍然是必學的,能打下更堅實的基礎。
其中 Spring 是一個輕量級的控制反轉(IoC)和面向切面(AOP)的容器框架。它可以裝載 Bean(也就是 Java 中的類,包括 Service、Dao 里面的),有了控制反轉這個機制,我們就不用在每次使用類的時候先初始化,用 new 關鍵字聲明。另外,Spring 的 AOP、事務管理等等都是我們經常用到的。
SpringMVC 分離了控制器、模型對象、分派器以及處理程序對象的角色,這種分離讓它們更容易進行定制。
MyBatis 是一個支持普通 SQL 查詢,存儲過程和高級映射的優秀持久層框架。MyBatis 對 JDBC 做了封裝,它讓數據庫底層操作變的透明。 MyBatis 的操作都是圍繞一個叫 sqlSessionFactory 的實例展開的,通過配置文件關聯到各實體類的 Mapper 文件,Mapper 文件中配置了每個類對數據庫所需進行的 SQL 語句映射。在每次與數據庫交互時,通過 sqlSessionFactory 拿到 sqlSession,再執行 SQL 命令。
怎么學習這部分內容呢?我不太建議看書,因為這方面的書籍在豆瓣上的評分都不怎么高。
SSM 實戰 100 集:https://www.bilibili.com/video/BV1NX4y1G7wx
Spring5框架最新版教程:https://www.bilibili.com/video/BV1Vf4y127N5
2021 最新版 SpringMVC 視頻教程:https://www.bilibili.com/video/BV1qp4y1n7D1
2021 最新版 MyBatis 視頻教程:https://www.bilibili.com/video/BV1c54y1a7GE
然后是 Spring Boot。Spring Boot 是由 Pivotal 團隊提供的一個全新框架,其設計目的是用來簡化 Spring 應用的初始搭建以及開發過程。該框架使用了特定的方式來進行配置,從而使開發人員不再需要定義樣板化的配置。說句人話就是,Spring Boot 不是什么新的框架,它默認配置了很多框架的使用方式,就像 Maven 整合了所有的 Jar 包,Spring Boot 整合了所有的框架。使用 Spring Boot有什么好處其實就是簡單、快速、方便!我推薦看純潔的微笑的博客,訪問量在千萬級別以上,影響了無數的初學者,我個人強烈推薦。
spring-boot - 純潔的微笑博客
如果說已經掌握了 Spring、SpringMVC、MyBatis、Spring Boot 等內容,就有能力進行一些真正有用的應用項目開發了,可以拿下面這些項目作為練手,都是 GitHub 上一些星標超級多的優質項目,對增加項目經驗有很大幫助。
1)電商秒殺
SpringBoot 完整電商系統 Mall:包括前臺商城系統及后臺管理系統,基于 SpringBoot+MyBatis 實現。
一套微服務商城系統 mall-swarm:采用了 Spring Cloud Greenwich、Spring Boot 2、MyBatis、Docker、Elasticsearch 等核心技術,同時提供了基于 Vue 的管理后臺。
miaosha:秒殺系統設計與實現。
2)博客論壇
vhr:微人事是一個前后端分離的人力資源管理系統,項目采用 SpringBoot+Vue 開發。
halo([?he?lo?],意為光環,也可以當成拼音讀(哈嘍)):一個優秀的開源博客發布應用。
對于在校生來說,缺的就是實戰經驗,我推薦的這些練手項目可以很好的彌補這塊短板,挑一個拿出來練就足夠了哈,不需要全部都練。
三、Java 虛擬機和 Java 源碼
先說 Java 虛擬機。
Java 虛擬機(JVM)是相對難吃透的一個環節,但卻十分的重要,JVM 屏蔽了與具體操作系統平臺相關的信息,使得 Java 程序只需要生成在 Java 虛擬機上能運行的目標代碼,也就是字節碼,就可以實現跨平臺的訴求了。JVM 學得通透的話,可以說是非常牛逼的程序員了。
給大家推薦一個 B 站上的視頻,分為《內存與垃圾回收篇》《字節碼與類的加載篇》《性能監控與調優篇》三個篇章。
https://www.bilibili.com/video/av83622425
然后再推薦一本書《深入理解 Java 虛擬機》,周志明老師的。第三版在豆瓣上的評分直接來到了 9.5 分,可以說是強得一筆!這是一部從工作原理和工程實踐兩個維度深入剖析 JVM 的著作,是計算機領域公認的經典。
- 第一部分(第1章),主要講 Java 虛擬機的歷史
- 第二部分(第2~5章),詳細講解了 Java 的內存區域劃分和垃圾收集器
- 第三部分(第6~9章),深入分析了class 文件結構、虛擬機的類加載機制
- 第四部分(第10~11章),程序編譯和代碼優化
- 第五部分(第12~13章),主要講解了 Java 實現高并發的原理,包括線程與協程、鎖優化等等。
總之一點,Java 虛擬機是成神之路上的巔峰之戰!
再來說說 Java 源碼。
面試的時候,面試官都特別喜歡問一些源碼方面的知識,比如說 HashMap 的一些經典問題,加載因子為什么是 0.75?哈希沖突的時候,HashMap 是如何查找并確認元素的等等,這些問題只有通過源碼才能得出比較準確的回答,對吧?
給大家推薦 B 站上一個視頻,詳細地介紹了如何閱讀 Java 源碼。
https://www.bilibili.com/video/BV1V7411U78L
這里說一下 Java 源碼閱讀的順序:
- lang
- util
- io
- nio
- math
- time
- net
其中的重點:
- String
- Integer
- ArrayList
- LinkedList
- CopyOnWriteArrayList
- HashMap
- TreeMap
- LinkedHashMap
- ConcurrentHashMap
- CopyOnWriteArrayList
四、數據庫
學習一門編程語言,如果不去操作下數據,就感覺這門編程語言空有皮囊卻沒有靈魂,對吧?所以數據庫部分是必學的。
先說書。
《SQL 必知必會》是麻省理工學院、伊利諾伊大學等眾多大學的參考教材,這本書直接從 SQL 的 SELECT 開始,講述了實際工作環境中最常用和最必需的 SQL 知識,實用性極強。該書作者后來還出了一本《MySQL 必知必會》,同樣很薄的一本書,也可以看一看。
《高性能 MySQL》,業界公認的一本經典的 MySQL 讀物了,有著廣泛的影響力。
目前大多數公司的存儲都是 MySQL + Redis,MySQL 作為主要的存儲方式,Redis 作為緩存,用來加快熱點數據的讀寫速度,從而提高性能。所以學完 MySQL,可以趁熱打鐵學一下 Redis。
《Redis 深入歷險核心原理與應用實戰》分為基礎和應用篇、原理篇、集群篇、拓展篇、源碼篇共 5
大塊內容?;A和應用篇講解對讀者來說最有價值的內容,可以直接應用到實際工作中;原理篇、集群篇讓開發者透過簡單的技術表面看到精致的底層世界;拓展篇幫助讀者拓展技術視野和夯實基礎,便于進階學習;源碼篇讓高階的讀者能夠讀懂源碼,掌握核心技術實力。
Redis 的重要性不言而喻了,是互聯網技術架構在存儲系統中最為廣泛的中間件,也是后端面試中最經常被問到的模塊之一。
《MongoDB 權威指南》是一本廣受好評的 MongoDB 權威著作,作者是谷歌的一名軟件工程師,曾有 5 年是 MongoDB 項目的核心成員。
再來說說推薦的視頻。
SQL 推薦 B 站上一個老外的課,英文中字版的,內容制作得非常棒,所以完全不用擔心聽不懂。10 個小時就能看完。
https://www.bilibili.com/video/BV1UE41147KC
MySQL 的推薦 B 站上的一個女老師的,講得很精彩,彈幕也很精彩。
https://www.bilibili.com/video/BV12b411K7Zu
Redis 的也推薦一個:
https://www.bilibili.com/video/BV1S54y1R7SB
Redis 是面試中經??嫉囊粔K知識點,像下面這些經常被問,參考自老錢的文章:
- Redis 有哪些數據結構?
- 使用過Redis分布式鎖么,它是什么回事?
- 假如Redis里面有1億個key,其中有10w個key是以某個固定的已知的前綴開頭的,如果將它們全部找出來?
- 使用過Redis做異步隊列么,你是怎么用的?
- 如果有大量的key需要設置同一時間過期,一般需要注意什么?
- Redis如何做持久化的?
- Pipeline有什么好處,為什么要用pipeline?
- Redis的同步機制了解么?
- 是否使用過Redis集群,集群的原理是什么?
五、計算機組成原理
眾所周知,計算機是由 CPU、內存、顯示器這些設備組成的硬件,但我們大學畢業后,往往從事的是軟件方面的開發工作。那怎樣才能在硬件和軟件之間自由穿梭呢?答案就是學好計算機組成原理。弄明白了計算機的組成原理,也就對整個軟件開發有了一個系統的認知,不論是計算機的硬件原理,還是軟件架構,都能很好的駕馭,隨之而來的,我們的職業發展機會也就更多了。
計算機組成原理這門課完全可以用一個詞來概括,就是“抽象”。在我看來這也是整個計算機設計中所蘊含的的靈魂。《計算機是怎樣跑起來的》,很適合作為一本了解計算機的入門書。在外人看來,計算機很復雜,對內行人來說,計算機說起來很簡單:
- 輸入、運算、輸出是硬件的基礎
- 軟件是數據和指令的集合
- 計算機和人的思考方式不同,對計算機來說,什么都是數字
既然聊到計算機,很有必要給大家推薦 B 站上的一門計算機科學速成課,講解的內容有:
計算機早期歷史
電子計算機
布爾邏輯
二進制
算術邏輯單元
寄存器 & 內存
中央處理器
指令和程序
高級 CPU 設計
早期的編程方式
編程語言發展史
編程原理
算法入門
數據結構
阿蘭圖靈(我最喜歡的一集)
軟件工程
集成電路 & 摩爾定律
操作系統
內存 & 儲存介質
文件系統
壓縮
命令行界面
屏幕 & 2D 圖形顯示
個人計算機革命
圖形用戶界面
3D 圖形
計算機網絡
互聯網
萬維網
計算機安全
黑客 & 攻擊
加密
機器學習 & 人工智能
計算機視覺
自然語言處理
機器人
計算機心理學
天網 & 計算機的未來
非常值得每個程序員去刷一刷的,全部都是計算機專業需要掌握的知識點啊,至少是應該了解的知識點。關鍵是視頻的畫面特別精良,我來截幅圖給大家感受下。
關鍵是英文中字版的,觀看起來毫無壓力。我自己每天會刷一集。像二進制這一集,以前經常被二進制搞得暈頭轉向,刷了這集視頻后,明顯感覺對二進制沒那么生疏了,仿佛一個陌生人坐在對面,喝了一杯酒后,就成了老熟人。
https://www.bilibili.com/video/av21376839
我看彈幕有人說,“第一次用 B 站看這么正經的東西?!焙盟鞯恼鎸嵮?#xff01;我也是。
最后再推薦一本書,《編碼-印尼在計算機軟硬件背后的語言》,這本書講述的是計算機背后的工作原理。
你是否想知道計算機如何工作和運行的?
你是否想了解計算機是如何一步一步創造出來的?
你是否想了解計算機知識的來龍去脈?
你是否想了解計算機的歷史?
你是否想制造出一臺自己的計算機?
你是否想知道硬件與軟件的區別?
你是否想知道電報機、電的原理?
你是否想創造自己的編程語言?
你是否想知道你買的電腦中說明書上說的主頻、內存、顯示器象素、顯存的概念和意義?
你是否想知道我們常用的十進制的由來?
你是否一直迷惑于二進制的理解?
你是否想知道那些赫赫有名的IT公司的歷史和發展?
你是否想探詢那些天才是如何思考和發明的?
你是否想象科學家一樣思考?
這一連串問答摘自豆瓣書評
這本書將一一為你揭開謎底。本書的內容涉及數理邏輯、布爾代數、組合數學、集合、物理、化學和電子學等等知識。
六、計算機網絡
當今這個時代,沒有網絡簡直無法生存,哪怕是在電梯里的一分鐘,我都受不了那種手機沒有網絡的狀態。我們所學的編程知識,如果脫離了網絡,將變得毫無意義,因為沒有哪個編程語言是要在單機環境下運行的。
計算機網絡課怎么學習,給大家推薦四本書,一門公開課。
《網絡是怎樣連接的》,這本書從在瀏覽器中輸入網址開始,一路追蹤到顯示出網頁內容為止的整個過程,以圖配文,講解了網絡的全貌,并重點介紹了網絡設備和軟件是如何工作的。
《TCP/IP 詳解》,這是一本完整而詳細的 TCP/IP 協議指南,基本上做通信的是人手一本。對于大多數程序員來說,了解這個 TCP/IP 對面試和編程也有很大的幫助。
《圖解 HTTP》,HTTP協議是互聯網的基石,學完后可以嘗試實現一個屬于自己的 HTTP 服務器了。
《計算機網絡-自頂向下方法》,算是一本經典的大學教材了,
關于計算機網絡這塊,可以配合 B 站上的《計算機網絡微課堂》一起來學習。
https://www.bilibili.com/video/BV1c4411d7jb
這門課主要介紹了計算機網絡的基本概念和基本原理,從下到上依次講解物理層、數據鏈路層、網絡層、運輸層和應用層,以因特網和網絡技術為實例,深入講解和分析了計算機網絡的基本原理、方法和技術精髓。這門課程學完后,你將:
- 輕松學懂計算機網絡,掌握相關的理論基礎。
- 對于要參加 408 考研的同學,可以從容應考。
- 如果將來要從事計算機網絡相關的科研,也能打下堅實的基礎。
七、計算機操作系統
為什么要學習操作系統呢?
第一,面試要考;
第二,無論學習哪門子編程語言,比如說 Java、C/C++,都需要和操作系統打交道,像 Java 中的多線程技術,其實是由操作系統來負責進程和線程管理的;
第三,學習操作系統,還能學到內存分配方面的知識。
同樣推薦兩本書,《深入理解計算機系統》和《鳥哥的Linux私房菜 基礎學習》。
《深入理解計算機系統》,按理說,這本書的名字應該叫《計算機系統導論》,有 C語言、數據結構的知識就可以學這本書了,想在畢業后去大廠的學弟學妹值得花時間去三刷一下這本書,注意是三刷,第一刷大致了解,第二刷精度,第三刷溫習。可以說得上是程序員了解計算機系統的最佳書籍了,可以去 CSAPP 課程官網找 Lab 配合刷起來。
《鳥哥的Linux私房菜 基礎學習》,這是一本 Linux 方面的暢銷書了,全面詳細地介紹了 Linux 操作系統,如果要學習 Linux 的話,首選。
八、數據結構與算法
無論什么時候,程序=數據結構+算法這種說法都是成立的。
常用的數據結構有:
- 棧:棧是一種非常有用的數據結構,它就像一摞盤子,第一個放在最下面,第二個放在第一個上面,第三個放在第二個上面,最后一個放在最上面。棧遵循后進先出的原則,也就是“Last In First Out”(簡稱 LIFO)——最后的一個進的,最先出去。
- 隊列:只允許在隊尾添加數據,隊首移除數據。隊列在 Java 中的出現頻率非常高,有各種不同的類來滿足不同的場景需求。像優先級隊列 PriorityQueue、延時隊列 DelayQueue 等等。隊列遵循的是First In First Out,縮寫為FIFO,也就是先進先出,第一個進入隊列的第一個先出來。
- 數組:數組這種數據結構最大的好處,就是可以根據下標(或者叫索引)進行操作,插入的時候可以根據下標直接插入到具體的位置,但與此同時,后面的元素就需要全部向后移動,需要移動的數據越多,就越累。
- 鏈表:鏈表在物理存儲空間是不連續的,但每個節點要么知道它的下一個節點是誰,要么知道它的上一個節點是誰,仿佛就像我們之間隔著千山萬水,卻心有靈犀一點鏈。像 LinkedList 就是最典型的鏈表結構,通過引用相互鏈接。
- 樹:樹是一種典型的非線性結構,它是由 n(n>0)個有限節點組成的一個具有層次關系的集合。之所以叫“樹”,是因為這種數據結構看起來就像是一個倒掛的樹,只不過根在上,葉在下。
- 哈希表:也叫散列表,是一種可以通過關鍵碼值(key-value)直接訪問的數據結構,它最大的特點就是可以快速實現查找、插入和刪除。
- 圖:圖是一種復雜的非線性結構,由頂點的有窮非空集合和頂點之間邊的集合組成,通常表示為:G(V,E),其中,G 表示一個圖,V 是圖 G 中頂點的集合,E 是圖 G 中邊的集合。
常用的算法有:
- 查找
- 插入
- 刪除
- 更新
- 排序
算法研究的目的是為了更有效的處理數據,提高數據運算的效率,數據運算是定義在數據結構上的,各大公司的筆試基本都考這個,《劍指 Offer》上的所有題目如果能背下來,LeetCode 上的題如果能刷個一百到三百道,ACM 競賽如果能拿到一些獎項。在找工作的時候會非常有優勢,基本上大廠小廠的 offer 可能會拿到手軟。
刷完 300 道 LeetCode 題后,我強到可以和面試官硬剛!純正 Java 版
視頻的話,推薦 B 站上的一個,韓順平老師的。
https://www.bilibili.com/video/av54029771
評論區有同學給出了數據結構與算法在面試中經??嫉闹R點,和視頻是關聯的:
- P16~P23 單鏈表
- P24~P26 雙向鏈表
- P27~P29 約瑟夫環
- P30~P35 棧·棧實現計算器
- P36~P42 前綴,中綴,后綴表達式,逆波蘭計算器的實現
- P43~P49 遞歸,迷宮回溯,八皇后
- P50~P53 排序算法基礎
- 54~56 冒泡排序
- 57~59 選擇排序
- 60~62 插入排序
- 63~65 希爾排序
- 66~68 快速排序
- 69~71 歸并排序
- 72~75 基數排序
- 76 各種排序的比較
- 127~131 二叉排序樹
- 132~134 BST刪除一棵子樹的節點
- 135 二叉平衡樹
- 146~151 圖,圖的深度優先和廣度優先
- 156~159 動態規劃
- 160~163 暴力匹配和KMP算法
- 164~ 167 貪心算法
順帶說一下,我上面總結的這套體系是非常完備的,可以說拿到任何地方都是有公信力的,幾乎完美到無可挑剔(自信有點上頭)。
如果你很幸運的,從大一就看到了這個學習路線,那么恭喜你,實習 Offer 可以說是手到擒來了!如果稍微有那么一點不走運,看到的比較晚,那么一句很雞賊的話送給你,“種一棵樹最好的時間要么是十年前,要么是現在?!?/p>
我是二哥呀!記得給二哥點贊,好不好?(偷偷搜藏也行)
總結
以上是生活随笔為你收集整理的凌晨起来肝的一篇 Java 学习路线,保证学弟学妹们大三大四的时候顺利找到实习 Offer的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: IOS7.1.2越狱手工美化(字体,状态
- 下一篇: Java中文英文数字混合掩码_Java8