前言
Set接口是Collection接口的子类,其继承了所有方法。那么他有什么独特的特点呢,下来我们来研究一下Set接口以及她的实现类的特点
提示:以下是本篇文章正文内容,下面案例可供参考
一、Set接口:
1.Set接口特点:
数据是不能重复的、最多可以存储一个null值
2.Set的实现类:
HashSet、LinkedHashSet和TreeSet
Set接口提供的方法API:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210602162711504.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xpYW5nY2hlbmcwMjEz,size_16,color_FFFFFF,t_70)
二、HashSet
1.HashSet的特点:
1、HashSet不能保证数据有序
2、HashSet数据是不能重复的
3、HashSet是可以存储null值
2.HashSet的属性:
//map属性是存储数据的,是HashMap类型的数据
private transient HashMap<E,Object> map;
//PRESENT属性,HashMap中填充的value值
private static final Object PRESENT = new Object();
3.HashSet的构造函数:
调用HashSet的构造函数发现其底层是实现了一个HashMap的
public HashSet() {
map = new HashMap<>();
}
public HashSet(Collection<? extends E> c) {
map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));
addAll(c);
}
public HashSet(int initialCapacity, float loadFactor) {
map = new HashMap<>(initialCapacity, loadFactor);
}
public HashSet(int initialCapacity) {
map = new HashMap<>(initialCapacity);
}
4.HashSet方法:
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
public boolean remove(Object o) {
return map.remove(o)==PRESENT;
}
public void clear() {
map.clear();
}
由上面的源码我们可以发现HashSet底层实现是基于HashMap来实现的,将set中存储的值作为HashMap的key来处理,PRESENT是一个填充的value值
三、LinkedHashSet:
1.LinkedHashSet的特点:
1、数据有序
2、数据不能重复
3、数据是可以存储null的
2.LinkedHashSet的继承关系和构造器:
通过声明形式可知:其继承自HashSet,其继承了HashSet中所有的属性和方法
public class LinkedHashSet<E> extends HashSet<E>
implements Set<E>, Cloneable, java.io.Serializable {
public LinkedHashSet(int initialCapacity, float loadFactor) {
super(initialCapacity, loadFactor, true);
}
public LinkedHashSet(int initialCapacity) {
super(initialCapacity, .75f, true);
}
public LinkedHashSet() {
super(16, .75f, true);
}
public LinkedHashSet(Collection<? extends E> c) {
super(Math.max(2*c.size(), 11), .75f, true);
addAll(c);
}
}
通过声明形式可知:其继承自HashSet,其继承了HashSet中所有的属性和方法
构造函数调用父类HashSet中方法如下:
HashSet(int initialCapacity, float loadFactor, boolean dummy) {
map = new <>(initialCapacity, loadFactor);
}
LinkedHashSet的实现是基于LinkedHashMap来实现的
LinkedHashSet数据有序的特征是基于LinkedHashMap来保证的,其底层利用双向链表来实现的数据有序
3、LinkedHastSet的应用场景:
在去重的基础上数据有序
四、TreeSet
1.TreeSet的特点:
1、数据自然有序(自定义排序,实现Comparator接口)
2、数据不能重复
3、数据不能为null
2.属性:
//TreeSet实现类的一共父接口实例用来存储数据
private transient NavigableMap<E,Object> m;
//PRESENT属性,HashMap中填充的value值
private static final Object PRESENT = new Object();
3.构造器方法
通过源码可知:TreeSet底层是基于treeMap来实现的
TreeSet(NavigableMap<E,Object> m) {
this.m = m;
}
public TreeSet() {
this(new TreeMap<>());
}
public TreeSet(Comparator<? super E> comparator) {
this(new TreeMap<>(comparator));
}
public TreeSet(Collection<? extends E> c) {
this();
addAll(c);
}
public TreeSet(SortedSet<E> s) {
this(s.comparator());
addAll(s);
}
总结
当我们学习完Set的接口和他的实现类以后发现他们的实现都是基于对应Map的来实现,他的存在是为了我们只需要进行对单一数据操作来保证数据不重复等特点的使用的。