Set家族一览:

HashSet简介
Set是Collection三大接口其中之一,意为集合,且元素不能重复。Set接口中的方法和Collection中的方法完全一致,只是起到一个标记名的作用。
HashSet是哈希集的意思,就是通过hashcode来实现set不能出现重复元素的一个实现类。
内部其实是通过哈希表HashMap来实现的,实际上set中存放的元素是内部hashmap中的键:
private transient HashMap<E,Object> map;
private static final Object PRESENT = new Object();//所有的键对应的值都是一个冗余的Object对象
在构造方法中初始化哈希表:
public HashSet() {
map = new HashMap<>();
}
浪费时间警告:这是一个纯HashMap实现的类
重载的构造方法
public HashSet(Collection<? extends E> c)
通过一个集合来构造HashSet,默认哈希表的容量是集合的容量*4/3 + 1
和16
中的最大值
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)
这个实际上就是提供两个构造HashMap的参数,一个是初始大小,一个是负载因子。
public HashSet(int initialCapacity, float loadFactor) {
map = new HashMap<>(initialCapacity, loadFactor);
}
public HashSet(int initialCapacity)
这个就是提供HashMap的初始大小。
public HashSet(int initialCapacity) {
map = new HashMap<>(initialCapacity);
}
重要方法
public int size()
HashMap的size
public int size() {
return map.size();
}
public boolean contains(Object o)
HashMap中是否有对应的键。
public boolean contains(Object o) {
return map.containsKey(o);
}
public boolean add(E e)
将一个记录插入HashMap
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
public boolean remove(Object o)
public boolean remove(Object o) {
return map.remove(o)==PRESENT;
}
总结
这是一个纯使用HashMap实现的数据结构。
仔细看了一下TreeSet也是用TreeMap实现的,那我就不搞TreeSet了。
原创文章,作者:彭晨涛,如若转载,请注明出处:https://www.codetool.top/article/hashset%e6%ba%90%e7%a0%81%e5%88%86%e6%9e%90/