1、HashSet类图
HashSet
是
Set
接口的典型实现,大多数时候使用
Set
集合时都使用这个实现类。
HashSet
按
Hash
算法
来存储集合中的元素,因此具有很好的存取和查找性能。
HashSet
具有以下特点:
–不能保证元素的排列顺序
–HashSet不是线程安全的
–集合元素可以使 null
当向 HashSet集合中存入一个元素时,HashSet会调用该对象的 hashCode() 方法来得到该对象的 hashCode值,然后根据 hashCode值决定该对象在 HashSet中的存储位置。
如果两个元素的
equals()
方法返回
true
,但它们的
hashCode
()
返回值不相等,
hashSet
将会把它们存储在不同的位置,但依然可以添加成功。
HashSet底层是通过引用HashMap来实现。默认初始化容量16,加载因子0.75。
2、HashSet构造实现以及重要方法
对HashSet而言,其实现是依靠内部关联一个HashMap对象,对HashSet的操作都转为对这个HashMap对象响应对象的操作。添加到Set中的元素作为Map对象的key,,对应的value为一个公用的静态对象PRESENT
,代码中为:
private
transient HashMap<E,Object> map;
// Dummy value to associate with an Object in the backing Map
private static final Object PRESENT = new Object();
1) 构造器
HashSet 提供了5个不同的构造器。
// 默认的无参构造器,
实际底层会初始化一个空的HashMap,并使用默认初始容量为16和加载因子0.75。
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(Collection<? extends E> c) {
map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));
addAll(c);
}
//
以指定的initialCapacity和loadFactor构造一个空的HashSet。
public HashSet(int initialCapacity, float loadFactor) {
map = new HashMap<>(initialCapacity, loadFactor);
}
//以指定的initialCapacity构造一个空的HashSet。
public HashSet(int initialCapacity) {
map = new HashMap<>(initialCapacity);
}
2)
iterator(): Iterator<E> 遍历Set的迭代器
// 返回对此set中元素进行迭代的迭代器。返回元素的顺序并不是特定的。
//
层实际调用底层HashMap的keySet来返回所有的key,由此
可见HashSet中的元素,只是存放在了底层HashMap的key上。
public Iterator<E> iterator() {
return map.keySet().iterator();
}
3) contains(o: Object): boolean 判断Set中是否包含对应的元素
// 如果此set包含指定元素,则返回true。
更确切地讲,当且仅当此set包含一个满足(o==null ? e==null : o.equals(e))
的e元素时,返回true。
public boolean contains(Object o) {
return map.containsKey(o);
}
4) add(e: E): boolean 向Set中添加元素方法
// 如果此set中尚未包含指定元素,则添加指定元素。
更确切地讲,如果此 set 没有包含满足(e==null ? e2==null : e.equals(e2))
的元素e2,则向此set 添加指定的元素e。
如果此set已包含该元素,则该调用不更改set并返回false。
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
5) remove(o: Object): boolean 将元素从Set中移除的方法
// 如果指定元素存在于此set中,则将其移除。
更确切地讲,如果此set包含一个满足(o==null ? e==null : o.equals(e))的元素e,
则将其移除。如果此set已包含该元素,则返回true
(或者:如果此set因调用而发生更改,则返回true)。(一旦调用返回,则此set不再包含该元素)。
public boolean remove(Object o) {
return map.remove(o)==PRESENT;
}