目录
基本介绍
HashSet实现自Set接口,它是由哈希表支持的一个集合,它保证了元素的唯一,但不保证元素的存储顺序(无序的),允许元素为null。
HashSet是线程不安全的,如果在多线程的环境下使用HashSet就必须在外部加上同步锁来保证线程安全。
常用方法
HashSet()
HashSet(Collection<? extends E> c)
HashSet(int initialCapacity, float loadFactor)
HashSet(int initialCapacity)
HashSet(int initialCapacity, float loadFactor, boolean dummy)
int size()
boolean isEmpty()
boolean contains(Object o)
boolean add(E e)
boolean remove(Object o)
源码解析
1. 基本元素
// HashSet的底层实现是HashMap
private transient HashMap<E,Object> map;
// 因为HashSet的值实际上是当作HashMap的key来存储的(由此来保证唯一),PRESENT则当作map的value
private static final Object PRESENT = new Object();
2. add(E e)
public boolean add(E e) {
// hashSet的元素其实就是当作hashMap的key来存储的,由此保证其元素的唯一性
// 因为HashMap的key是支持为null的,所以set也支持为null的元素
return map.put(e, PRESENT)==null;
}
总结
1. HashSet基于哈希表实现
2. HashSet是无序的
3. HashSet存储的元素是唯一的
4. HashSet支持存储为null的元素
5. HashSet是线程不安全的
因为HashSet是基于HashMap实现的,所以本文中没有再针对为什么它能保证唯一行等等进行阐述,会在后续HashMap的解析中再跟大家一起学习~