太刺激了,面試官讓我手寫跳錶,而我用兩種實現方式吊打了TA!
阿新 • • 發佈:2020-09-08
# 前言
> 本文收錄於專輯:[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