public class HashSet<E> extends AbstractSet<E>
implements Set<E>, Cloneable, java.io.Serializable
HashSet 底层使用 HashMap 来实现, 所以是非线程安全的
HashSet的元素放在 HashMap 的 key 里,value 为固定的 PRESENT 对象, PRESENT对象是一个空对象
HashSet利用了HashMap key不重复的特性来实现元素的唯一性.
private static final Object PRESENT = new Object();
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
HashMap 的 put 方法,如果插入的key原来不存在,则返回null
如果要获取HashSet里面的元素, 只能通过迭代器来完成, HashSet本身没有get()方法来实现随机读取
迭代器实际返回的是底层HashMap中key的迭代器:
public Iterator<E> iterator() {
return map.keySet().iterator();
}
为什么HashSet没有get方法
- Set接口本来就没有定义get方法
- HashSet是不重复,无序的散列集, 通过contains方法判断是否存在元素
- JDK1.8之后, HashMap底层数据结构是数组+链表+红黑树,如果不做特殊处理,无法通过索引直接获取元素,且索引一般作用于线性搜索,比如数组简而言之就是这样的数据结构本身就不支持通过索引去获取元素
- HashSet是作为一种去重工具