Set的继承关系
Set是一个继承自Collection的接口,它里面的元素不可以重复。
HastSet 和 TreeSet 是Set的两个实现类。
HashSet依赖于HashMap,实际上通过HashMap来实现,HashSet中的元素是无序的。
TreeSet依赖于TreeMap,实际通过TreeMap来实现,TreeSet中的元素是有序的。
接下来对HashSet进行分析。
一. HashSet简介
HashSet继承自AbstractSet,实现了Set接口,Cloneable接口,序列化接口。
HashSet的属性:
二.HashSet构造函数
①无参构造函数
public HashSet() {
map = new HashMap<>();//对Map进行实例化
}
②带参构造函数
---带集合的HashSet
public HashSet(Collection<? extends E> c) {
map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));
addAll(c);
}
c.size/0.75f是集合的空间大小,选择16是考虑了HashMap的性能优化,在这两个中选择较大值作为HashMap的容量
---指定初始容量和加载因子
public HashSet(int initialCapacity, float loadFactor) {
map = new HashMap<>(initialCapacity, loadFactor);
}
---指定初始容量
public HashSet(int initialCapacity) {
map = new HashMap<>(initialCapacity);
}
三.主要方法
1.add()
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
这里的PRESENT就是键值对里的值,调用了HashMap的put方法
2.remove()
public boolean remove(Object o) {
80 return map.remove(o)==PRESENT;
81 }
调用了HashMap的remove方法,返回的是删除键值对的value值,如果它和present相等,说明删除成功,返回true,否则返回false。
四.例题
十万个数据,不重复的打印。
可以使用HashSet这种数据结构
Random random = new Random();
HashSet<Integer> hashSet = new HashSet<Integer>();
/*
*将十万个数据添加到HashSet中
*/
for(int i = 0;i < 100000;i++){
int val = random.nextInt(100);
hashSet.add(val);
}
Iterator<Integer> iterator= hashSet.iterator();
//用迭代器遍历
while(iterator.hasNext()){
System.out.print(iterator.next()+" ");
}
System.out.println();