HashSet和TreeSet有什么區別呢?
他們的區別主要在他們底層的數據結構不同。HashSet使用的HashMap來實現的,而TreeSet使用的TreeMap來實現的。
HashMap和TreeMap的區別呢?
HashMap是一個最常用的數據結構,它主要用於我們又通過固定值(key)獲取內容的場景,時間復雜度可以最快優化到O(1),當然效果不好的時候時間復雜度是O(logN)或者O(n)。雖然固定值查找提高了速度,但是HashMap不能保證固定值,也就是key的順序,所以這個時候TreppMap就出現了,雖然它的查找、刪除、更新的時間復雜度都是O(logN),但是它保證了key的有序性。
HashMap和TreeMap的底層實現有什么不同呢?
HashMap使用的是數組和哈希的方式實現,巧妙通過可以的哈希路由到每個數組用於存放內容,這時候通過key獲取value的時間復雜度就是O(1),當然因為key的哈希可能碰撞,所以就需要針對碰撞的時候做處理,HashMap里面每一個數組里面存的其實是一個鏈表,key的哈希沖突以后會追加到鏈表上面,這個時候再通過key獲取value的時候時間復雜度就是O(n),那么碰撞越多的時候查詢是不是會變得很慢呢?最后為了優化這個時間復雜度,HashMap當一個key碰撞次數超過treeify threshold的時候就會把鏈表轉化成紅黑樹,這樣雖然插入的時候也增加了時間復雜度變成了O(logN),說到紅黑樹就把HashMap和TreeMap聯系到一起了,因為TreeMap的底層實現就是紅黑樹。
那為什么用紅黑樹而不用二叉搜索樹呢?
二叉搜索樹是左子樹的值小於根節點,右子樹的值大於根節點,如果構建根節點以后插入的數據是有序的,那么構造出來的二叉搜索樹就不是平衡樹,二十一個鏈表,那么它的時間復雜度就是O(n)。紅黑樹因為每個節點都是黑色或者紅色兩種顏色,當然他也有一些特性,
1.根節點是黑色的
2.紅色節點的子節點和父節點都是黑色
3.任何一條路經的黑色節點個數相同。

