1. 程式人生 > >太刺激了,面試官讓我手寫跳錶,而我用兩種實現方式吊打了TA!

太刺激了,面試官讓我手寫跳錶,而我用兩種實現方式吊打了TA!

# 前言 > 本文收錄於專輯:[http://dwz.win/HjK](http://dwz.win/HjK),點選解鎖更多資料結構與演算法的知識。 你好,我是彤哥。 上一節,我們一起學習了關於跳錶的理論知識,相信通過上一節的學習,你一定可以給面試官完完整整地講清楚跳錶的來龍去脈,甚至能夠邊講邊畫圖。 ![15](https://img2020.cnblogs.com/blog/1648938/202009/1648938-20200908065312458-1046070607.jpg) 然而,面試官說,既然你這麼精通跳錶,不如實現一個唄^^ 我,我,實現就實現,誰怕誰,哼~~ 本節,我將通過兩種方式手寫跳錶,並結合畫圖,徹底搞定跳錶實現的細節。 第一種方式為跳錶的通用實現,第二種方式為彤哥自己發明的實現,並運用到HashMap的改寫中。 好了,開始今天的學習吧,Let's Go! > 文末有跳錶和紅黑樹實現的HashMap的對比,不想看程式碼的同學也可以直達底部。 # 通用實現 通用實現主要參考JDK中的ConcurrentSkipListMap,在其基礎上,簡化,並優化一些東西,學好通用實現也有助於理解JDK中的ConcurrentSkipListMap的原始碼。 ## 資料結構 首先,我們要定義好實現跳錶的資料結構,在通用實現中,將跳錶的資料結構分成三種: - 普通節點,處於0層的節點,儲存資料,典型的單鏈表結構,包括h0 - 索引節點,包含著對普通節點的引用,同時增加向右、向下的指標 - 頭索引節點,繼承自索引節點,同時,增加所在的層級 類圖大概是這樣: ![3](https://img2020.cnblogs.com/blog/1648938/202009/1648938-20200908065313016-1940915404.jpg) OK,給出程式碼如下: ```java /** * 頭節點:標記層 * @param