Module java.base
Package java.util

Class HashSet<E>

类型参数:
E - 此集合中维护的元素类型
所有实现的接口:
Serializable, Cloneable, Iterable<E>, Collection<E>, Set<E>
直接已知的子类:
JobStateReasons, LinkedHashSet

public class HashSet<E> extends AbstractSet<E> implements Set<E>, Cloneable, Serializable
此类实现了Set接口,由哈希表(实际上是HashMap实例)支持。它不保证集合的迭代顺序;特别是,它不保证顺序会随时间保持不变。此类允许null元素。

此类对基本操作(addremovecontainssize)提供恒定时间性能,假设哈希函数将元素正确分散在桶中。遍历此集合需要的时间与HashSet实例的大小(元素数量)加上支持HashMap实例的“容量”(桶数量)之和成正比。因此,如果迭代性能很重要,则不要将初始容量设置得太高(或负载因子设置得太低)非常重要。

请注意,此实现不是同步的。如果多个线程同时访问哈希集,并且至少有一个线程修改了集合,则必须在外部进行同步。通常通过在自然封装集合的某个对象上同步来实现这一点。如果不存在这样的对象,则应使用Collections.synchronizedSet方法“包装”集合。最好在创建时执行此操作,以防止意外的非同步访问集合:

   Set s = Collections.synchronizedSet(new HashSet(...));

此类的iterator方法返回的迭代器是快速失败的:如果在创建迭代器后的任何时间修改了集合,除非通过迭代器自身的remove方法,否则迭代器会抛出ConcurrentModificationException。因此,在面对并发修改时,迭代器会快速且干净地失败,而不是在未来的不确定时间冒险地面临任意的、非确定性的行为。

请注意,迭代器的快速失败行为不能保证,因为一般来说,在存在非同步并发修改的情况下,不可能做出任何硬性保证。快速失败迭代器尽力抛出ConcurrentModificationException。因此,编写依赖此异常正确性的程序是错误的:迭代器的快速失败行为应仅用于检测错误。

此类是Java集合框架的成员。

自 JDK 版本:
1.2
参见:
  • Constructor Details

    • HashSet

      public HashSet()
      构造一个新的空集;支持的HashMap实例具有默认的初始容量(16)和负载因子(0.75)。
    • HashSet

      public HashSet(Collection<? extends E> c)
      构造一个包含指定集合中的元素的新集合。使用默认负载因子(0.75)创建HashMap,并且初始容量足以容纳指定集合中的元素。
      参数:
      c - 要放入此集合中的元素的集合
      抛出:
      NullPointerException - 如果指定的集合为 null
    • HashSet

      public HashSet(int initialCapacity, float loadFactor)
      构造一个新的空集;支持的HashMap实例具有指定的初始容量和指定的负载因子。
      API 注意:
      要创建一个初始容量适应预期元素数量的HashSet,请使用newHashSet
      参数:
      initialCapacity - 哈希映射的初始容量
      loadFactor - 哈希映射的负载因子
      抛出:
      IllegalArgumentException - 如果初始容量小于零,或者负载因子为非正数
    • HashSet

      public HashSet(int initialCapacity)
      构造一个新的空集;支持的HashMap实例具有指定的初始容量和默认负载因子(0.75)。
      API 注意:
      要创建一个初始容量适应预期元素数量的HashSet,请使用newHashSet
      参数:
      initialCapacity - 哈希表的初始容量
      抛出:
      IllegalArgumentException - 如果初始容量小于零
  • Method Details

    • iterator

      public Iterator<E> iterator()
      返回此集合中元素的迭代器。元素以无特定顺序返回。
      指定者:
      iterator 在接口 Collection<E>
      指定者:
      iterator 在接口 Iterable<E>
      指定者:
      iterator 在接口 Set<E>
      指定者:
      iterator 在类 AbstractCollection<E>
      返回:
      此集合中元素的迭代器
      参见:
    • size

      public int size()
      返回此集合中元素的数量(基数)。
      指定者:
      size 在接口 Collection<E>
      指定者:
      size 在接口 Set<E>
      返回:
      此集合中元素的数量(基数)
    • isEmpty

      public boolean isEmpty()
      如果此集合不包含任何元素,则返回true
      指定由:
      isEmpty 在接口 Collection<E>
      指定由:
      isEmpty 在接口 Set<E>
      覆盖自:
      isEmpty 在类 AbstractCollection<E>
      返回:
      true 如果此集合不包含任何元素
    • contains

      public boolean contains(Object o)
      返回true如果此集合包含指定的元素。更正式地说,当且仅当此集合包含一个元素e使得Objects.equals(o, e)返回true时,返回true
      指定由:
      contains 在接口 Collection<E>
      指定由:
      contains 在接口 Set<E>
      覆盖自:
      contains 在类 AbstractCollection<E>
      参数:
      o - 要测试其是否存在于此集合中的元素
      返回:
      true 如果此集合包含指定的元素
    • add

      public boolean add(E e)
      如果尚未存在,则将指定的元素添加到此集合。更正式地说,如果此集合不包含任何使得Objects.equals(e, e2)返回true的元素e2,则将指定的元素e添加到此集合。如果此集合已包含该元素,则调用不会更改集合并返回false
      指定由:
      add 在接口 Collection<E>
      指定由:
      add 在接口 Set<E>
      覆盖自:
      add 在类 AbstractCollection<E>
      参数:
      e - 要添加到此集合的元素
      返回:
      true 如果此集合之前未包含指定的元素
    • remove

      public boolean remove(Object o)
      如果存在,则从此集合中移除指定的元素。更正式地说,如果此集合包含使得Objects.equals(o, e)返回true的元素e,则移除该元素。如果此集合包含该元素,则返回true(或者等效地,如果此集合由于调用而更改)。(一旦调用返回,此集合将不包含该元素。)
      指定由:
      remove 在接口 Collection<E>
      指定由:
      remove 在接口 Set<E>
      覆盖自:
      remove 在类 AbstractCollection<E>
      参数:
      o - 如果存在,则从此集合中移除的对象
      返回:
      true 如果集合包含指定的元素
    • clear

      public void clear()
      从此集合中移除所有元素。调用返回后,集合将为空。
      指定由:
      clear 在接口 Collection<E>
      指定由:
      clear 在接口 Set<E>
      覆盖自:
      clear 在类 AbstractCollection<E>
    • clone

      public Object clone()
      返回此HashSet实例的浅拷贝:元素本身不会被克隆。
      覆盖自:
      clone 在类 Object
      返回:
      此集合的浅拷贝
      参见:
    • spliterator

      public Spliterator<E> spliterator()
      创建一个延迟绑定快速失败Spliterator,用于遍历此集合中的元素。

      Spliterator报告Spliterator.SIZEDSpliterator.DISTINCT。重写的实现应该记录其他特征值的报告。

      指定由:
      spliterator 在接口 Collection<E>
      指定由:
      spliterator 在接口 Iterable<E>
      指定由:
      spliterator 在接口 Set<E>
      返回:
      一个Spliterator,用于遍历此集合中的元素
      自1.8起:
      1.8
    • toArray

      public Object[] toArray()
      从类中复制的描述: AbstractCollection
      返回一个包含此集合中所有元素的数组。如果此集合对其元素由其迭代器返回的顺序有任何保证,那么此方法必须以相同顺序返回元素。返回的数组的运行时组件类型Object

      返回的数组将是“安全”的,即此集合不会保留对其的任何引用。(换句话说,即使此集合由数组支持,此方法也必须分配一个新数组)。因此,调用者可以自由修改返回的数组。

      指定由:
      toArray 在接口 Collection<E>
      指定由:
      toArray 在接口 Set<E>
      覆盖自:
      toArray 在类 AbstractCollection<E>
      返回:
      一个数组,其运行时组件类型Object,包含此集合中的所有元素
    • toArray

      public <T> T[] toArray(T[] a)
      从类中复制的描述: AbstractCollection
      返回一个包含此集合中所有元素的数组;返回数组的运行时类型与指定数组的类型相同。如果集合适合于指定数组,则将其返回。否则,将使用指定数组的运行时类型和此集合的大小分配一个新数组。

      如果此集合适合于指定数组且有多余空间(即,数组的元素多于此集合的元素),则数组中紧随集合末尾的元素将设置为null。(仅当调用者知道此集合不包含任何null元素时,此方法才有助于确定此集合的长度。)

      如果此集合对其元素由其迭代器返回的顺序有任何保证,那么此方法必须以相同顺序返回元素。

      指定者:
      toArray 在接口 Collection<E>
      指定者:
      toArray 在接口 Set<E>
      覆盖:
      toArray 在类 AbstractCollection<E>
      类型参数:
      T - 包含集合的数组的组件类型
      参数:
      a - 要存储此集合元素的数组,如果足够大;否则,将为此目的分配相同运行时类型的新数组。
      返回值:
      包含此集合中所有元素的数组
    • newHashSet

      public static <T> HashSet<T> newHashSet(int numElements)
      创建一个新的、空的HashSet,适用于预期元素数量。返回的集合使用默认的负载因子0.75,并且其初始容量通常足够大,以便可以添加预期数量的元素而无需调整集合大小。
      类型参数:
      T - 新集合中维护的元素类型
      参数:
      numElements - 预期元素数量
      返回值:
      新创建的集合
      抛出:
      IllegalArgumentException - 如果numElements为负数
      自 JDK 版本:
      19