HashSet简介
它继承AbstractSet,实现了Set接口,Cloneable,java.io.Serializable
HashSet是一个没有重复元素的集合
它是由HashMap实现的,不保证元素的顺序,而且HashSet允许使用null
1、成员变量
static final long serialVersionUID = -5024744406713321676L;
//HashSet是通过map(HashMap对象)保存内容的
private transient HashMap<E,Object> map;
// Dummy value to associate with an Object in the backing Map
// PRESENT是向map中插入key-value对应的value
// 因为HashSet中只需要用到key,而HashMap是key-value键值对;
// 所以,向map中添加键值对时,键值对的值固定是PRESENT
private static final Object PRESENT = new Object();
2构造方法
//默认构造函数
public HashSet() {
//调用HashMap的默认构造函数,创建Map
map = new HashMap<E,Object>();
}
public HashSet(Collection<? extends E> c) {
// 创建map。
// 将集合(c)中的全部元素添加到HashSet中
map = new HashMap<E,Object>(Math.max((int) (c.size()/.75f) + 1, 16));
addAll(c);
}
// 指定HashSet初始容量和加载因子的构造函数
public HashSet(int initialCapacity, float loadFactor) {
map = new HashMap<E,Object>(initialCapacity, loadFactor);
}
// 指定HashSet初始容量的构造函数
public HashSet(int initialCapacity) {
map = new HashMap<E,Object>(initialCapacity);
}
HashSet(int initialCapacity, float loadFactor, boolean dummy) {
map = new LinkedHashMap<E,Object>(initialCapacity, loadFactor);
}
3、方法
add():添加元素到集合中
调用了HashMap的put方法,将value值设置为默认,返回map.put()==null
如果添加的值有重复则,add()会返回false。如果添加的值在集合中是第一次出现那么会返回true
add时key为null时也会返回true
remove():删除元素
iterator():迭代器方法
也是调了HashMap的keySet().iterator()
4、应用场景
30个原始数据(可能存在重复),处理成无重复数据并按从小到大的顺序打印
代码如下:
public class HashSetGY {
public static void main(String[] args) {
Random random = new Random();
HashSet<Integer> hashSet = new HashSet<>();
ArrayList<Integer> arrayList = new ArrayList<>();
int[] arr = new int[30];
for (int i = 0;i < 30;i++) {
arr[i] = random.nextInt(30)+1;
hashSet.add(arr[i]);
arrayList.add(arr[i]);
}
System.out.println(arrayList);
System.out.println(hashSet);
}
}
运行结果:
从运行结果就可以看出来HashSet和其他集合的区别和特点。