title: HashSet解析
date: 2019-03-09 08:11:42
categor:
- Java基础
tags: - HashSet
- 容器类
HashSet解析
基本用法
HashSet
实现了Set
接口,Set
表示无重复元素、且不保证访问顺序的容器接口。与HashMap
类似,它有如下的构造方法。
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(int initialCapacity, float loadFactor) {map = new HashMap<>(initialCapacity, loadFactor);}
public HashSet(int initialCapacity) {map = new HashMap<>(initialCapacity);}
initialCapacity
(初始容量,默认16),loadFactor
(负载因子,默认0.75)与HashMap
中的含义是一样的。
HashSet
的用法也很简单。
List a= new ArrayList();
a.add(1);
a.add(1);
//直接传入个容器类进去
Set c = new HashSet<>(a);
Iterator iterator = c.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
因为
HashSet
中是无重复元素的,所以结果为1。这个特性可以将其用于去重。
基本原理
HashSet
其实就是HashMap
实现的,在HashSet
内部有个HashMap
实例变量。
private transient HashMap<E,Object> map;
还有个常量。在Map中有key,有value,而在HashSet中相当于只有key,所有的value都是这个常量。
private static final Object PRESENT = new Object();
再来看看add(E e)方法
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
直接调用
HashMap
的put
方法,将元素作为key
,常量PRESENT
作为value
存入,null
值也可以存入,若集合中已有元素,则保持集合不变返回false
。
检查也是HashMap
的方法:
public boolean contains(Object o) {
return map.containsKey(o);
}
检查
map
中是否有对应的key。
删除也是HashMap
的方法:
public boolean remove(Object o) {
return map.remove(o)==PRESENT;
}
删除对应key的节点。
结论
HashSet
原理较为简单,实现了Set
接口,内部维护了一个HashMap
,特点是无重复元素,元素无顺序,可以用于去重,集合运算,若想了解更深层次的,可以看看HashMap
的实现。