共同點:
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。