天天看点

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。