頂尖Java工程師的紅黑技能樹,如何快速點亮?

阿里技術_發表於2018-12-19

640?wx_fmt=jpeg


在今年的杭州雲棲大會上,眾所期待的新書《碼出高效》正式釋出,並宣佈將所有圖書收益捐贈於公益專案。


伴隨著《阿里巴巴Java開發手冊》影響面越來越廣,影響程度越來越深,讀者也越來越好奇《碼出高效》背後的故事、對映的技術問題以及深層次的技術思考。


機會來了!12月20日(本週四)晚19:30,鎖定阿里技術直播,對話《碼出高效》作者孤盡,共同探索程式碼規約之美。

 

640?wx_fmt=jpeg


直播主題:


發現程式碼之美——《碼出高效》圖書作者交流會


直播參與方式:


錯過這次可能要等一年。兩種直播觀看的解鎖方式如下,趕緊收藏起來~


  • 直接觀看:掃描上方圖片二維碼,或點選本文末尾的“閱讀原文”,在瀏覽器中(記住!一定要用瀏覽器開啟,手機或PC均可)開啟直播連結,收藏起來,定好鬧鐘,12月20日準時觀看。u1F61D.png

  • 釘釘群觀看:使用“釘釘”搜尋《碼出高效》讀者交流群號:23383493、21936668(擇一即可,請不要重複加哦)加入永久釘釘群,既可到時觀看直播,也可與作者孤盡、其他讀者交流互動。


主播介紹:


孤盡,花名取意“獨孤九劍,破盡天下武功之意”的意思,畢業於浙江工業大學,《阿里巴巴Java開發手冊》和《碼出高效》作者 。2011年校招進入阿里以來,歷經淘寶聚石塔、開放平臺、國際事業部,現在負責阿里巴巴程式碼平臺建設。2016年3月,孤盡帶領集團約碼專案組編寫《阿里巴巴Java開發手冊》,碼出高效,碼出質量,推動阿里系與業界一起進步,讓程式碼變得更舒服,更清澈,更好維護。

主持人:首次出鏡有點忐忑求輕拍的阿里妹


直播內容:


《碼出高效》源於影響了全球250萬名開發工程師的《阿里巴巴Java開發手冊》,涵蓋計算機領域基礎知識、物件導向理念、JVM核心解析、資料結構與集合、高併發多執行緒、異常和日誌、單元測試以及如何編寫可讀性強、可維護性好的優雅程式碼等多個方面,講解由淺入深。

 

本次直播,我們將重點分享此書的核心內容之一:集合與資料結構。這是走向Java高手的必經之路,但是由於資料結構相對晦澀難懂,集合類的坑比較多,有時連資深Java工程師都會失手,給工程專案帶來無法預估的損失。


除了高手進階祕籍以外,我們還將分享《碼出高效》寫作背後的小故事,聊聊Java學習心得。同時,阿里妹還準備了多本作者簽名版的圖書,送給參與直播的小夥伴們。


640?wx_fmt=jpeg


為什麼集合與資料結構這麼重要?


我們經常說,“程式=資料結構+演算法”。假如程式是一道美味佳餚的話,那麼資料結構就是食材,食材的選擇對於菜的品質是至關重要的,爛菜葉、黴土豆是不可能做出極品菜餚的。


我們在編碼時,如果資料結構存在嚴重的設計缺陷,在程式碼層面去修正,花費的代價是極大的,甚至是不可能的。底層資料結構的缺陷也是重構的第一誘因,無端地浪費寶貴的人力資源。集合作為資料結構的載體,對元素進行加工和輸出,以一定的演算法實現最基本的增刪改查功能,它是資料結構與演算法的中間紐帶,因此集合是所有程式語言的基礎,非常重要。在進入高併發程式設計時代後,由集合引發的相關故障佔比越來越高。比如,多執行緒共享集合時出現的髒資料問題;HashMap在資料擴容時出現節點之間的死鏈問題;寫多讀少的場景誤用某些集合導致效能下降問題等。

 

在精彩的直播開始之前,我們先來一道前菜,熱熱身。附上《碼出高效》精彩節選:揭開紅黑樹的生澀面紗,期待和你在週四晚直播時一起深入探討。


640?wx_fmt=gif

紅黑樹是一種熟悉而陌生的資料結構,熟悉是指“別人家的開發工程師”運用在JDK原始碼或各種演算法中,陌生指的是理解紅黑樹的理論基礎比較多,比較生澀而難懂。在瞭解紅黑樹之前,我們先聊聊資料結構到底是什麼?

640?wx_fmt=png

資料結構是什麼?


資料結構是指邏輯意義上的資料組織方式及其相應的處理方式。


1、什麼是邏輯意義? 資料結構的抽象表達非常豐富,而實際物理儲存的方式相對單一。比如,二叉樹在磁碟中的儲存真的是樹形排列嗎?並非如此。


2、什麼是資料組織方式?邏輯意義上的組織方式有很多,比如樹、圖、佇列、雜湊等。樹可以是二叉樹、三叉樹、B+ 樹等;圖可以是有向圖或無向圖;佇列是先進先出的線性結構;雜湊是根據某種演算法直接定位的資料組織方式。


3、什麼是資料處理方式? 簡單地說就是增刪改查。即在既定的資料組織方式上,以某種特定的演算法實現資料的增加、刪除、修改、查詢和遍歷。不同的資料處理方式往往存在著非常大的效能差異。

 

資料結構的評判


那麼經常有開發同學說,我的輸入規模量級非常小,遠沒有需要考慮到資料結構時間複雜度的地步,但是,除了問題規模之外,還有一個因素需要考慮,就是呼叫頻率,即使這個方法的演算法複雜度只是快了20納秒,在日均上億次的呼叫情況下,也可能是節約了若干臺伺服器。


資料結構的各種型別沒有好壞之分,它只有與場景、資料量結合起來綜合考慮,才有實際的意義。場景包括操作型別使用頻率,資料量的大小決定它選擇什麼樣的資料結構型別。到底是寫為主,還是讀為主,或者說讀寫均衡。其中寫是以插入為主,還是刪除為主;讀是以遍歷為主,還是查詢單個元素為主。資料量的不同也會決定不同資料結構的使用效率。所以單純地說紅黑樹與AVL是哪個好,哪個壞,是不對的。


紅黑樹


AVL樹與紅黑樹之間沒有從屬關係,他們都是二叉查詢樹。AVL 樹演算法是以蘇聯數學家Adelson-Velsky 和Landis名字命名的平衡二叉樹演算法。紅黑樹是於1972 年發明的,當時稱為對稱二叉B 樹,1978 年得到優化,正式命名為紅黑樹。面對頻繁的插入和刪除,紅黑樹更為合適;面對低頻修改、大量查詢時,AVL 樹將更為合適。


我們重點來說說紅黑樹,它廣泛應用在JDK11的各種集合框架內,比如:HashMap,TreeMap等。它在二叉查詢樹的性質基礎上,額外引入了5 個約束條件: 


  • 節點只能是紅色或黑色

  • 根節點必須是黑色

  • 所有NIL 節點都是黑色的

  • 一條路徑上不能出現相鄰的兩個紅色節點

  • 在任何遞迴子樹內,根節點到葉子節點的所有路徑上包含相同數目的黑色節點


擴充套件說明一下NIL釋義,它可以形象理解為Nothing In Leaf,是紅黑樹中特殊的存在,即在葉子節點上不存在的兩個虛擬節點,它是紅黑樹旋轉的假設性理論基礎,預設為黑色的。


總結一下,即“有紅必有黑,紅紅不相連”,上述5 個約束條件保證了紅黑樹的新增、刪除、查詢的最壞時間複雜度均為O (LogN )。如果一個樹的左子節點或右子節點不存在,則均認定為黑色。紅黑樹的任何旋轉在3 次之內均可完成。我們以實際插入節點55,56,57來看看紅黑樹的插入,以達到拋磚引玉的效果。


640?wx_fmt=png


當插入57 時,由於父節點56 是紅色的,出現兩個連續紅色節點,違反紅黑樹特性,需要重新著色,根據演算法56這個節點是變為黑色,而根節點變為紅色,這個時候並不平衡並且根節點為紅色,這兩條違反紅黑樹特性。所以必須左旋操作,結果如最右端所示。如果需要重新著色或旋轉,存在三種情形總結如下:


  • 節點的父親是紅色,叔叔是紅色的,則重新著色。

  • 節點的父親是紅色,叔叔是黑色的,而新節點是父親的左節點:進行右旋。

  • 節點的父親是紅色,叔叔是黑色的,而新節點是父親的右節點:進行左旋。


注意在第3個圖的節點55的左邊是一個虛擬的NIL,根據紅黑樹的特性,它是黑色。56這個節點需要進行旋轉時,它的父親是紅色,叔叔是黑色的,進行左旋。


還想看到更多Java進階課程?週四晚上19:30,我們在阿里技術直播間不見不散。smiley_12.png


對於Java開發有疑惑的同學,歡迎在留言區留下你的問題,我們將在直播統一解答。



640?wx_fmt=jpeg

關注「阿里技術」

把握前沿技術脈搏


↓戳這裡收藏,本週四晚暢聊Java!

相關文章