public class HashSet<E>
extends AbstractSet<E>
implements Set<E>, Cloneable, java.io.Serializable
{
static final long serialVersionUID = -5024744406713321676L; //java序列化机制
private transient HashMap<E,Object> map; //将不需要序列化的属性前添加关键字transient 是不是很熟悉这个map 哈哈哈
// Dummy value to associate with an Object in the backing Map
private static final Object PRESENT = new Object();
}
//默认构造器
public HashSet() {
map = new HashMap<>();
}
//将传入的集合添加到HashSet的构造器
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);
}
//仅明确初始容量的构造器(装载因子默认0.75)
public HashSet(int initialCapacity) {
map = new HashMap<>(initialCapacity);
}
- 看完hashSet的构造器想必大家已经很不陌生了吧,这简直是一个非常完美的偷天换日 皮包公司 哈哈哈(接到活,直接丢给map处理
- HashMap的数据存储是通过数组+链表/红黑树实现的,存储大概流程是通过hash函数计算在数组中存储的位置,如果该位置已经有值了,判断key是否相同,相同则覆盖,不相同则放到元素对应的链表中,如果链表长度大于8,就转化为红黑树,如果容量不够,则需扩容(注:这只是大致流程)。
hashMap原理及底层实现,储存过程
public int size() // 集合中元素个数
public boolean isEmpty() // 是否为空
public boolean contains(Object o) // 是否包含指定元素
public boolean add(E e) // 添加元素
public boolean remove(Object o) // 删除元素
public void clear() // 删除所有元素
java集合 arrayList源码分析add方法自动扩容机制(上)
作者:Teddy (公众号:鸡仓故事汇)
ok!到这里就大功告成,小编(Teddy)在这里先感谢大家的到来。
虽然不是太详细,小编已经很努力,给小编来个一键三连(点赞,关注,收藏),小编会越来越努力。。。