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