该类实现了Set接口,由一个哈希表(实际上是一个Hash Map实例)作为后台。它不保证集合的迭代顺序;特别地,它并不能保证秩序会随着时间的推移而保持不变。该类允许空元素。
该类为基本操作(添加、删除、包含和大小)提供了恒定的时间性能,假设哈希函数在桶之间适当分散元素。迭代这个集合需要的时间正比于Hash Set实例的大小(元素的个数)加上支持Hash Map实例(桶的数量)的"容量"之和。因此,如果迭代性能很重要,不要将初始容量设置得太高(或负荷系数过低)是非常重要的。注意,这种实现并不同步。如果多个线程并发访问一个哈希集,并且至少有一个线程修改该哈希集,则必须对外同步。这通常是通过对一些自然封装集合的对象进行同步来完成的。如果不存在这样的对象,则应该使用Collections . synchronoused Set方法对集合进行"包装"。这最好在创建时完成,以防止意外的不同步访问集合:
Set s = Collections.synchronizedSet(new HashSet(...));
该类迭代器方法返回的迭代器是快速失败的:如果在迭代器创建后的任意时刻修改了集合,除了通过迭代器自身的移除方法之外,迭代器以任何方式抛出了Concurrent ModificationException。因此,在面对并发修改时,迭代器能够快速、干净地失效,而不是冒着在未来不确定时刻发生任意、非确定性行为的风险。
需要注意的是,迭代器的快速失效行为是无法保证的,因为一般来说,在存在不同步的并发修改的情况下,无法做出任何硬性保证。快速迭代器在尽力而为的基础上抛出Concurrent ModificationException。因此,编写一个依赖于此异常的程序来保证其正确性是错误的:迭代器的失效快行为应该只用于检测bug。
该类是Java集合框架的成员。
进入HashSet 他的构造器就是new一个HashMap

HashSet的add方法底层就是HashMap的put方法来添加元素,存放的值就HashMap的key,因为我们的HashMap的key不允许重复,HashSet也是不允许存放重复元素。

- package com.example.list.list;
-
- import java.util.HashMap;
-
- //手写HashSet
- public class HashSet
{ - private HashMap
map; - private static final Object PRESENT = new Object();
-
- public HashSet() {
- map = new HashMap<>();
- }
-
- public boolean add(E e) {
- return map.put(e, PRESENT) == null;
- }
-
- @Override
- public String toString() {
- return "HashSet{" +
- "map=" + map +
- '}';
- }
- }
HashSet没有Get方法,就是因为他底层是基于HashMap实现的,是散列的,无法通过index来准确的获取元素,要想获取存放的元素可以用迭代器或者加强for循环

HashSet基于HashMap来实现,不重复元素的集合
允许null值
是无序的,不会记录插入的顺序
没有Get方法,所以不能使用普通的for循环遍历