去年的這個時候樓主經過兩個月的複習拿到了阿里巴巴的 offer,有一些運氣,也有一些心得,藉着跳槽季來臨特此分享出來。
簡單梳理一下個人複習思路,同時也但願和你們一塊兒交流討論,一塊兒學習,若是不對之處歡迎指正一塊兒學習。本文便是複習思路,亦可當作學習思路。git
我大體把 JAVA 的複習分爲以下幾個方向。github
下面簡單說一下如何複習上面的知識,首先明確,樓主不會講解具體的知識點,而是一個思路,縱觀互聯網上面的帖子、文章誤人子弟的多一些,因此就不誤人子弟了,而是推薦分析出知識點而後以看書爲主。畢竟書是多方校對權威出版的讀物。面試
JVM 是每個開發人員必備的技能,推薦看國內比較經典的 JVM 書籍,裏面包含JVM的內存接口,類的加載機制等基礎知識,是否是以爲這些在面試中似曾相識?因此對於 JVM 方面的知識的鞏固與其在網上看一些零零碎碎的文章不如啃一下這本書。固然在啃書的時候切記不能圖快,你對知識的積累不是經過看書的數量來決定,而是看書的深度。因此在看每一章節的時候看到不懂的要配合網上的文章理解,而且須要看幾篇文章理解,由於一篇文章極可能是錯誤的,樓主認爲文章的可信度順序,自建域名>*.github.io>SF>簡書=博客園>CSDN>轉載。這是購買書籍的地址,固然你能夠選擇在網上搜索一下 PDF 版本:《深刻理解 Java 虛擬機:JVM 高級特性與最佳實踐(第 2 版)》,固然了若是你的英文好強烈推薦看 Oracle 最新發布的 JAVA 虛擬機規範。算法
排序算法和 Java 集合&工具類。這一個分類是每個人必須掌握的並熟練使用的,那麼爲何我把他們放在一塊兒呢?
由於工具和集合類都源於算法,在準備算法複習以前你要理解,爲何要必考算法。正式由於排序算法和咱們編程息息相關。舉兩個「栗子」。
你能夠看一下Collections 中的mergeSort和sort 方法,你會發現 mergeSort 就是歸併排序的實現,而 sort 方法結合了歸併排序和插入排序,這樣使得 sort 方法最差O(NlogN)最好能夠達到O(N)的效果。那麼只有你本身理解了排序方法的實現,才能更好的使用 JAVA 中的集合類啊?
第二個「栗子」,你們都聽聞過 TopN 問題吧,常常在面試中遇到請寫一下 TopN 的實現,說到算法他就是一個大頂堆,說到 JAVA 它是一個 PriorityQueue 的實現,那麼你理解了 TopN 問題,知道他的時間複雜度,優缺點了,那麼是否是即可以熟練運用 JAVA 的工具類寫更高效的程序了?
之因此排序算法和 JAVA 集合&工具類 同樣重要是由於他們和咱們天天的編程息息相關。面試官老是問排序算法也不是在難爲你,而是在考察你的編程功底。因此呢你須要對着排序算法和基本的算法配合 JAVA 的集合類、工具類仔細的研究一番,這樣才能更深刻的理解他們的關聯關係。數據庫
多線程和併發包,重要性就不累述了,直接說一下學習方法。你首先要理解多線程不只僅是 Thread 和 Runnable 那麼簡單,整個併發包下面的工具都是在爲多線程服務。對於多線程的學習切不可看幾篇面試文章,或者幾個關鍵字 CountDownLatch,Lock 巴拉巴拉就覺得理解了多線程的精髓,樓主整理了一個大圖
你須要針對這個大圖或者本身梳理一個大圖,對裏面的類各個擊破,他們的使用場景,優缺點。看的差很少你就會發現,其實他和 JAVA 集合類、工具類密不可分。那麼天然把它列爲重要知識點的緣由不言而喻。編程
存儲相關相關都是咱們平時經常使用的工具,Redis,MySQL,ElasticSearch。它的知識點分爲兩方面,一方面是你平時使用過程當中積累的經驗,另外一方面是你對其的深刻理解。因此對這個地方的建議就是經過書籍來鞏固技術知識, 《Redis設計與實現 (數據庫技術叢書)》,《高性能 MySQL》,《ElasticSearch 權威指南》這三本數不必定是該領域最好的書籍,可是若是你吃透了,對於你對知識的理解和程序的設計一定有很大幫助。書裏面的內容太多,仍是舉兩個「栗子」。
第一個「栗子」,使用 Redis 切不可只用他當作 key-value 緩存數據庫。樓主瞭解到它的5種基本類型中一種類型叫作 sorted set。sorted set 裏 items 內容大於 64 的時候同時使用了 hash 和 skiplist 兩種設計實現。這也會爲了排序和查找性能作的優化。添加和刪除都須要修改 skiplist,因此複雜度爲 O(log(n))。 可是若是僅僅是查找元素的話能夠直接使用 hash,其複雜度爲 O(1) ,其餘的 range 操做複雜度通常爲 O(log(n)),固然若是是小於 64 的時候,由於是採用了 ziplist 的設計,其時間複雜度爲 O(n)。這樣之後查詢和更新閱讀都變得簡單,那是否是能夠用其實現 TopN 的需求呢?這樣相似的需求就不須要你查數據,再在內存裏面計算和操做了。好比咱們簡單的周排行,月排行均可以考慮使用這個數據結構實現,固然並不必定這是最好的解決方案,而是提供了一種解題思路。
另外一個「栗子」,PriorityQueue 是優先隊列咱們上文已經瞭解,那麼 ElasticSearch 的 query 也是用的優先隊列分別在每個分片上面獲取,而後再合併優先隊列你瞭解嗎?這個「栗子」告訴咱們其實算法是想通的,你理解一個即可以觸類旁通舉一反三。小程序
一談框架就想起來 Spring,一說 Spring 就想起來 IOC,AOP。由於你們都在用這個框架,因此對於框架也不須要看一些其餘的,直接就深刻了解一下 Spring 就能夠了。經過上面的敘述你已經瞭解了樓主的思路,看什麼都要看他的實現原理,因此直接推薦你一本書《Spring 技術內幕》而後對着本身現有的 Spring 項目 Debug,從請求開始梳理知識點。樓主認爲 Spring 出來這麼久你們對基本的知識已經瞭然於胸,重要的是看其解決問題的思路和原理,栗子又來了。
好比須要實如今 Bean 剛剛初始化的時候作一些操做,InitializingBean 具體怎麼使用,它的原理是什麼,Spring Bean 的生命週期是什麼樣子,經過具體的使用場景逐步展開說明。 這樣複習效果會更好一些。設計模式
這是一個老生常談的話題,也是這幾年比較火的話題,提及分佈式就必定和 Dubbo 有關係,可是不能僅僅就理解到 Dubbo。首先咱們須要思考它解決的問題,爲何要引入 Dubbo 這個概念。隨着業務的發展、用戶量的增加,系統數量增多,調用依賴關係也變得複雜,爲了確保系統高可用、高併發的要求,系統的架構也從單體時代慢慢遷移至服務SOA時代,應運而生的 Dubbo 出現了,它做爲 RPC 的出現使得咱們搭建微服務項目變得簡單,可是咱們不只僅要思考 Dubbo帶來的框架支撐。同時須要思考服務的冪等,分佈式事務,服務之間的 Trace 定位,數據對帳,重試機制等,於此同時考慮 MQ 對系統的解耦和壓力的分擔、數據庫分佈式部署和分庫分表、限流、熔斷等機制。因此最終總結是不只僅要看 Dubbo 的使用,原理同時還要思考上下游和一些系統設計的問題,這塊相對的知識點較多,能夠有一個初步的概念而後各個擊破。緩存
設計模式不少,可是經常使用的就幾種,樓主認爲這個地方能夠分兩個地方準備。
1,學以至用,設計模式不是背出來的,而是用出來了,平時多注意思考當前項目的設計,是否能夠套用設計模式,固然必須先理解每個設計模式存在的意義。
2,在現有框架中思考設計模式的體現,上面已經講過框架怎麼學習,用 Spring 距離,它裏面一共用了9種設計模式,你都知道用到哪裏了嗎?若是不知道,試着把他們找出來,同時思考爲何這麼設計,所有找到之後,基本的設計模式的用法和原理你也就都理解了。性能優化
小編運營的微信訂閱號 「碼匠筆記」,就前後就任於 ThoughtWorks、阿里巴巴等互聯網公司的經驗分享,包含但不限於 JAVA、併發編程、性能優化、架構設計、小程序、開源軟件等。有興趣能夠關注一波,一塊兒學習、討論。