Set中每个元素都是唯一的,并且不保证插入元素的顺序。
1. 父接口
Set继承了Collection接口,并且具有父接口的所有方法。
2. 实现类
Set下有TreeSet、HashSet实现类,HashSet下有LinkedHashSet子类。
TreeSet
保持次序的Set,底层实现为树结构。可以提取出有序的序列。存放的元素必须实现Comparator接口。
TreeSet实现了SortedSet接口,该接口继承自Set接口。
public interface SortedSet<E> extends Set<E>
public class TreeSet<E> extends AbstractSet<E> implements NavigableSet<E>,Cloneable,java.io.Serializable
新增了comparator(排序方式)、subSet(生成Set子集)、headSet(生成Set子集)、tailSet(生成Set子集)、first(返回第一个元素)、last(返回最后一个元素)方法。
HashSet
为快速查找而设计的Set,元素必须实现hashCode()。
HashSet继承自AbstractSet,实现了Set, Cloneable, java.io.Serializable接口。
public class HashSet<E> extends AbstractSet<E> implements Set<E>, Cloneable, java.io.Serializable
LinkedHashSet
具有HashSet的查询速度,且内部使用链表维护元素的顺序。必须实现hashCode()。
LinkedHashSet继承了HashSet,并实现Set, Cloneable, java.io.Serializable接口。
public class LinkedHashSet<E> extends HashSet<E> implements Set<E>, Cloneable, java.io.Serializable
3. 性能比较
添加元素
大小 | TreeSet | HashSet | LinkedHashSet |
---|---|---|---|
10 | 746 | 308 | 350 |
100 | 501 | 178 | 270 |
1000 | 714 | 216 | 303 |
10000 | 1975 | 711 | 1615 |
查找元素
大小 | TreeSet | HashSet | LinkedHashSet |
---|---|---|---|
10 | 173 | 91 | 65 |
100 | 264 | 75 | 74 |
1000 | 410 | 110 | 111 |
10000 | 552 | 215 | 256 |
迭代元素
大小 | TreeSet | HashSet | LinkedHashSet |
---|---|---|---|
10 | 89 | 94 | 93 |
100 | 68 | 73 | 55 |
1000 | 69 | 72 | 54 |
10000 | 69 | 100 | 58 |
可以看出HashSet性能总比TreeSet好,特别是在添加和查询元素时,所有一般使用HashSet。除非需要一个排好序的Set时,可以使用TreeSet。
4. 与其他集合类区别
Set和List区别
见集合类-List
Set和Map区别
相同点:都继承自Collection接口。Set元素和Map键值都不能重复。
不同点:Set保存单元素,Map保存键值对。