HashSet、LinkedHashSet、TreeSet的源碼剖析

前言

Set底層的Map,只有key是有值的,value都是null值,都是空的。

Set可以用Map來實現的,其實就是在map的key裏放置,value都是一個空的對象

HashSet

HashSet,他是一個集合,裏面的元素是無序的,他裏面的元素是沒有重複的

HashMap是不允許key重複的,他底層是一個數組,如果你的key重複了,你會hash尋址到數組的同一個位置去,然後覆蓋原來的值

HashMap的key是沒有重複的,無順序的,你插入進去的順序,跟你迭代遍歷的順序是不一樣的,HashSet是不是直接就可以基於HashMap來實現呢?

你不斷的往HashSet裏放入一些元素,人家底層就是不斷的put到HashMap裏去就ok了,如果你是從HashSet裏進行遍歷,人家就是直接遍歷HashMap的key就可以了

HashSet底層是基於HashMap來實現的,所以底層也是有數組的,擴容的問題,你可以在構造HashSet的時候就傳入數組的大小

LinkedHashSet

LinkedHashSet,他是有順序的set,也就是維持了插入set的這個順序,你迭代LinkedHashSet的順序跟你插入的順序是一樣的,底層是不是直接就可以基於LinkedHashMap來實現的呢?

LinkedHashSet.add()方法,底層會調用LinkedHashMap.put()方法,此時在這個方法裏就會在一個鏈表中記住加入元素的順序。後面你遍歷的時候,是從LinkedHashMap裏遍歷元素,人家是直接遍歷維護好的鏈表的

TreeSet

TreeSet,默認是根據你插入進去的元素的值來排序的,而且可以定製Comparator,自己決定排序的算法和邏輯,他底層是不是可以基於TreeMap來實現?

 

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