Java的HashSet源码详解
作者:Fly_Fly_Zhang
这篇文章主要介绍了Java的HashSet源码详解,HashSet底层封装的是HashMap,所以元素添加会放到HashMap的key中,value值使用new Object对象作为value,所以HashSet和HashMap的所具有的特点是类似的,需要的朋友可以参考下
HashSet
特点:
底层数据结构:HashSet底层封装的是HashMap,所以元素添加会放到HashMap的key中,value值使用new Object对象作为value;
所以HashSet和HashMap的所具有的特点是类似的;
- 数据不能重复;
- 可以存储null值;
- 数据不能保证插入有序;
默认值:与HashMap相同;
基本属性
private transient HashMap<E,Object> map;//HashMap集合
private static final Object PRESENT = new Object();//调用HashMap方法,装入的value值继承关系:
public class HashSet<E>
extends AbstractSet<E>//继承了AbstractSet
implements Set<E>,//实现set方法
Cloneable,//标记本类可以被克隆
java.io.Serializable//可以被序列化构造函数:均调了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);
}
HashSet(int initialCapacity, float loadFactor, boolean dummy) {
map = new LinkedHashMap<>(initialCapacity, loadFactor);
}CRUD(增删改查)
add()
public boolean add(E e) {//只能添加一个null值
return map.put(e, PRESENT)==null;
//HashMap的put方法,如果是新添加的结点,会返回null;
//如果是原有结点,那么会返回value值,这样返回的就是false这样表明集合中已经有该元素;
}remove();
public boolean remove(Object o) {
return map.remove(o)==PRESENT;
//HashSet添加进HashMap中所有value值都是PRESENT,
//如果找到key值,那么返回的value值肯定是PRESENT;
//没有找到,返回的是null;
}HashSet应用场景
去重 打印全部数据,重复性元素只打印一次;
ArrayList<Integer> arrayList=new ArrayList<>(100000);
for (int i = 0; i <100000 ; i++) {
arrayList.add((int) (Math.random()*1000));
}
iterator=arrayList.iterator();
HashSet<Integer> hashSet1=new HashSet<>();
while(iterator.hasNext()){
Integer val= iterator.next();
if(hashSet1.add(val)){//第一次添加才会返回true
System.out.println(val);
}
} 到此这篇关于Java的HashSet源码详解的文章就介绍到这了,更多相关Java的HashSet内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
