概述
HashSet是Java集合框架中非常重要的一个类,它实现了Set接口,不允许出现重复元素,并且元素是无序的。HashSet的底层实现主要依赖于HashMap,通过HashMap来存储元素。如果想要了解HashMap,可以查看后续文章。
类图
从以上类图可以看到,HashSet实现了三个接口,继承了一个抽象类:
Serializable
接口,表示Vector支持序列化功能Cloneable
接口,表示Vector支持克隆Set
接口,主要提供了添加、删除、遍历等功能AbstractSet
抽象类,主要提供元素对比、删除等操作
源码解读
成员变量
// 底层依赖HashMap,用于存储数据
private transient HashMap<E,Object> map;
// PRESENT是一个静态常量对象,用于作为HashMap的value
// 因为HashSet只关心key(即HashSet中的元素),不关心value,所以这里使用了一个统一的占位符对象
// Dummy value to associate with an Object in the HashMap
private static final Object PRESENT = new Object();
构造方法
HashSet
中提供了四种构造方案:
public HashSet()
默认构造函数public HashSet(Collection<? extends E> c)
创建一个包含集合c中所有元素的hashSet
集合public HashSet(int initialCapacity)
创建一个自定义的初始容量和默认的负载因子0.75的hashSet
集合public HashSet(int initialCapacity, float loadFactor)
创建一个自定义的初始容量和负载因子的hashSet
集合
添加元素
HashSet的添加元素操作是通过调用HashMap的put方法实现的。由于HashSet只关心key,所以value统一使用PRESENT
。
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
这里需要注意的是,HashMap的put方法会返回旧值,如果key不存在则返回null。因此,当HashSet添加一个新元素时,如果put方法返回null,说明元素添加成功;如果返回非null值,说明元素已经存在,添加失败。
删除元素
HashSet的删除元素操作是通过调用HashMap的remove方法实现的。
public boolean remove(Object o) {
return map.remove(o)==PRESENT;
}
同样地,HashMap的remove方法会返回被删除元素的旧值。如果HashSet成功删除了一个元素,那么remove方法应该返回PRESENT
;否则返回null。
其他操作
HashSet还提供了其他操作,如判断元素是否存在(contains方法)、获取元素数量(size方法)、清空集合(clear方法)等,这些操作都是直接调用底层HashMap的相应方法实现的。
总结
HashSet的底层实现主要依赖于HashMap。HashSet通过HashMap来存储元素,并利用HashMap的特性实现了不重复和无序的要求。
标签:HashMap,JDK,HashSet,元素,remove,源码,public,PRESENT From: https://www.cnblogs.com/grassLittle/p/18160672