TreeSet唯一性以及有序性底層剖析

TreeSet底層原理

TreeSet底層數據結構是紅黑樹(一種自平衡的二叉樹,自平衡是指如果有空的左/右子樹,元素會先入空的左/右子樹,而不會一直往一個方方向添加元素出現不平衡現象)。

這裏寫圖片描述

該自平衡二叉樹保證了元素的有序性(存儲邏輯順序),因爲按照前、中、後三種順序都可以有序的讀取到集合中的元素。
下面是關鍵底層源碼:
發現add方法中調用了TreeSet中的一個成員變量m.put()方法。

這裏寫圖片描述

這裏寫圖片描述

而NavigableMap是一個接口,但是它有一個實現類是TreeMap:

這裏寫圖片描述

那麼,就應該看看TreeSet中該m變量的初始化到底是哪個實現類了:

這裏寫圖片描述

看到默認構造器中爲TreeMap,則可以知道m.put()方法實際調用的是TreeMap中的put()方法,跟蹤進入源碼:

這裏寫圖片描述

這裏寫圖片描述

總結:通過觀察TreeSet的底層源碼發現,TreeSet的add(E e)方法,底層是根據實現Comparable的方式來實現的唯一性,通過compare(Object o)的返回值是否爲0來判斷是否爲同一元素。
compare() == 0,元素不入集合。
compare() > 0 ,元素入右子樹。
compare() < 0,元素入左子樹。
而對其數據結構:自平衡二叉樹做前(常用)、中、後序遍歷即可保證TreeSet的有序性。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章