天天看點

Java基礎——java集合之HashSet,TreeSet和LinkedHashSet

共同點:

1)、它們都實作了Set接口,都可以對資料進行CRUD操作(add(),remove()),都可以使用疊代器周遊;

2)、他們都是不允許元素重複的;

3)、它們都不是線程同步的:

如果多個線程同時通路一個HashSet(TreeSet或LinkedHashSet),而其中至少一個線程修改了該 set,則它必須 保持外部同步。這一般通過對自然封裝該 set 的對象進行同步操作來完成。 如果不存在這樣的對象,則應該使用

Collections.synchronizedSet

方法來“包裝”該 set。最好在建立時完成這一操作,以防止意外的非同步通路:

Set s = Collections.synchronizedSet(new HashSet(...));
           
SortedSet s = Collections.synchronizedSortedSet(new TreeSet(...));
           
Set s = Collections.synchronizedSet(new LinkedHashSet(...));
           

不同點:

1)、底層實作方式不同(HashSet:哈希表(實際上是一個HashMap執行個體),LinkedHashSet:哈希表+連結清單,TreeSet:基于TreeMap的

NavigableSet實作,

NavigableSet是擴充的 SortedSet);

2)、HashSet,TreeSet都不是有序增删元素,LinkedHashSet有序增删元素;

3)、HashSet,LinkedHashSet允許有null元素,TreeSet不允許有null元素;

4)、TreeSet可實作自動排序,HashSet、LinkedHashSet不能自動排序;

根據他們的共同點跟不同點結合實際情況選擇合适的set類,例如單純去重的話HashSet,需要按照增加順序擷取元素就使用LinkedHashSet,需要對所有的資料自然排序就使用TreeSet。