一、定义
HashSet是Java集合Set的一个实现类,Set是一个接口,其实现类除HashSet之外,还有TreeSet
public class HashSet<E>
extends AbstractSet<E>
implements Set<E>, Cloneable, java.io.Serializable
二、构造函数
1、默认构造器,可以看出,底层实现其实就是HashMap,HashMap在本人其他博客有总结
public HashSet() {
map = new HashMap<>();
}
2、将传入的集合添加到HashSet的构造器
public HashSet(Collection<? extends E> c) {
map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));
addAll(c);
}
3、明确初始容器和装载因子的构造器
装载因子:加载因子是表示Hsah表中元素的填满的程度
若:加载因子越大,填满的元素越多,好处是,空间利用率高了,但:冲突的机会加大了.
反之,加载因子越小,填满的元素越少,好处是:冲突的机会减小了,但:空间浪费多了.
public HashSet(int initialCapacity, float loadFactor) {
map = new HashMap<>(initialCapacity, loadFactor);
}
4、仅明确初始容量的构造器(装载因子默认0.75)
public HashSet(int initialCapacity) {
map = new HashMap<>(initialCapacity);
}
三、集合元素不能重复
HashSet自身并没有独立的实现,而是在里面封装了一个Map,HashSet是作为Map的key而存在的,所以集合元素是不重复的
private static void testSet() {
Set<String> set=new HashSet<String>();
set.add("green");
System.out.println(set);
set.add("green");
// 第二次是插入不进去的
System.out.println(set);
// 对比List List是可以加入重复元素
List<String> list =new ArrayList<String>();
list.add("green");
list.add("green");
System.out.println(list);
}
四、无序性
Set中的元素,没有顺序。严格的说,是没有按照元素的插入顺序排列
private static void testSetSort() {
Set<Integer> set=new HashSet<Integer>();
set.add(1);
set.add(9);
set.add(5);
System.out.println(set);
}
五、HashSet与HashMap的关系
通过源码可以发现,HashSet自身并没有独立的实现,而是在里面封装了一个Map。HashSet是作为Map的key而存在的
而value是一个命名为PRESENT的static的Object对象,因为是一个类属性,所以只会有一个
public class HashSet<E>
extends AbstractSet<E>
implements Set<E>, Cloneable, java.io.Serializable
{
//HashSet里封装了一个HashMap
private HashMap<E,Object> map;
private static final Object PRESENT = new Object();
//HashSet的构造方法初始化这个HashMap
public HashSet() {
map = new HashMap<E,Object>();
}
//向HashSet中增加元素,其实就是把该元素作为key,增加到Map中
//value是PRESENT,静态,final的对象,所有的HashSet都使用这么同一个对象
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
//HashSet的size就是map的size
public int size() {
return map.size();
}
//清空Set就是清空Map
public void clear() {
map.clear();
}
//迭代Set,就是把Map的键拿出来迭代
public Iterator<E> iterator() {
return map.keySet().iterator();
}
}