Class ImmutableSet<E>

All Implemented Interfaces:
Serializable, Iterable<E>, Collection<E>, Set<E>
Direct Known Subclasses:
RegularImmutableSet, SingletonImmutableSet

@GwtCompatible(serializable=true, emulated=true) public abstract class ImmutableSet<E> extends ImmutableCollection<E> implements Set<E>
A Set whose contents will never change, with many other important properties detailed at ImmutableCollection.
Since:
2.0
See Also:
  • Field Details

    • SPLITERATOR_CHARACTERISTICS

      static final int SPLITERATOR_CHARACTERISTICS
      See Also:
    • MAX_TABLE_SIZE

      static final int MAX_TABLE_SIZE
      See Also:
    • DESIRED_LOAD_FACTOR

      private static final double DESIRED_LOAD_FACTOR
      See Also:
    • CUTOFF

      private static final int CUTOFF
      See Also:
    • HASH_FLOODING_FPP

      static final double HASH_FLOODING_FPP
      We attempt to detect deliberate hash flooding attempts, and if one is detected, fall back to a wrapper around j.u.HashSet, which has built in flooding protection. HASH_FLOODING_FPP is the maximum allowed probability of falsely detecting a hash flooding attack if the input is randomly generated.

      MAX_RUN_MULTIPLIER was determined experimentally to match this FPP.

      See Also:
    • MAX_RUN_MULTIPLIER

      static final int MAX_RUN_MULTIPLIER
      See Also:
  • Constructor Details

    • ImmutableSet

      ImmutableSet()
  • Method Details

    • of

      public static <E> ImmutableSet<E> of()
      Returns the empty immutable set. Preferred over Collections.emptySet() for code consistency, and because the return type conveys the immutability guarantee.
    • of

      public static <E> ImmutableSet<E> of(E element)
      Returns an immutable set containing element. Preferred over Collections.singleton(T) for code consistency, null rejection, and because the return type conveys the immutability guarantee.
    • of

      public static <E> ImmutableSet<E> of(E e1, E e2)
      Returns an immutable set containing the given elements, minus duplicates, in the order each was first specified. That is, if multiple elements are equal, all except the first are ignored.
    • of

      public static <E> ImmutableSet<E> of(E e1, E e2, E e3)
      Returns an immutable set containing the given elements, minus duplicates, in the order each was first specified. That is, if multiple elements are equal, all except the first are ignored.
    • of

      public static <E> ImmutableSet<E> of(E e1, E e2, E e3, E e4)
      Returns an immutable set containing the given elements, minus duplicates, in the order each was first specified. That is, if multiple elements are equal, all except the first are ignored.
    • of

      public static <E> ImmutableSet<E> of(E e1, E e2, E e3, E e4, E e5)
      Returns an immutable set containing the given elements, minus duplicates, in the order each was first specified. That is, if multiple elements are equal, all except the first are ignored.
    • of

      @SafeVarargs public static <E> ImmutableSet<E> of(E e1, E e2, E e3, E e4, E e5, E e6, E... others)
      Returns an immutable set containing the given elements, minus duplicates, in the order each was first specified. That is, if multiple elements are equal, all except the first are ignored.

      The array others must not be longer than Integer.MAX_VALUE - 6.

      Since:
      3.0 (source-compatible since 2.0)
    • constructUnknownDuplication

      private static <E> ImmutableSet<E> constructUnknownDuplication(int n, Object... elements)
      Constructs an ImmutableSet from the first n elements of the specified array, which we have no particular reason to believe does or does not contain duplicates. If k is the size of the returned ImmutableSet, then the unique elements of elements will be in the first k positions, and elements[i] == null for k <= i < n.

      This may modify elements. Additionally, if n == elements.length and elements contains no duplicates, elements may be used without copying in the returned ImmutableSet, in which case the caller must not modify it.

      elements may contain only values of type E.

      Throws:
      NullPointerException - if any of the first n elements of elements is null
    • construct

      private static <E> ImmutableSet<E> construct(int n, int expectedSize, Object... elements)
      Constructs an ImmutableSet from the first n elements of the specified array. If k is the size of the returned ImmutableSet, then the unique elements of elements will be in the first k positions, and elements[i] == null for k <= i < n.

      This may modify elements. Additionally, if n == elements.length and elements contains no duplicates, elements may be used without copying in the returned ImmutableSet, in which case it may no longer be modified.

      elements may contain only values of type E.

      Throws:
      NullPointerException - if any of the first n elements of elements is null
    • copyOf

      public static <E> ImmutableSet<E> copyOf(Collection<? extends E> elements)
      Returns an immutable set containing each of elements, minus duplicates, in the order each appears first in the source collection.

      Performance note: This method will sometimes recognize that the actual copy operation is unnecessary; for example, copyOf(copyOf(anArrayList)) will copy the data only once. This reduces the expense of habitually making defensive copies at API boundaries. However, the precise conditions for skipping the copy operation are undefined.

      Throws:
      NullPointerException - if any of elements is null
      Since:
      7.0 (source-compatible since 2.0)
    • copyOf

      public static <E> ImmutableSet<E> copyOf(Iterable<? extends E> elements)
      Returns an immutable set containing each of elements, minus duplicates, in the order each appears first in the source iterable. This method iterates over elements only once.

      Performance note: This method will sometimes recognize that the actual copy operation is unnecessary; for example, copyOf(copyOf(anArrayList)) should copy the data only once. This reduces the expense of habitually making defensive copies at API boundaries. However, the precise conditions for skipping the copy operation are undefined.

      Throws:
      NullPointerException - if any of elements is null
    • copyOf

      public static <E> ImmutableSet<E> copyOf(Iterator<? extends E> elements)
      Returns an immutable set containing each of elements, minus duplicates, in the order each appears first in the source iterator.
      Throws:
      NullPointerException - if any of elements is null
    • copyOf

      public static <E> ImmutableSet<E> copyOf(E[] elements)
      Returns an immutable set containing each of elements, minus duplicates, in the order each appears first in the source array.
      Throws:
      NullPointerException - if any of elements is null
      Since:
      3.0
    • isHashCodeFast

      boolean isHashCodeFast()
      Returns true if the hashCode() method runs quickly.
    • equals

      public boolean equals(@Nullable Object object)
      Specified by:
      equals in interface Collection<E>
      Specified by:
      equals in interface Set<E>
      Overrides:
      equals in class Object
    • hashCode

      public int hashCode()
      Specified by:
      hashCode in interface Collection<E>
      Specified by:
      hashCode in interface Set<E>
      Overrides:
      hashCode in class Object
    • iterator

      public abstract UnmodifiableIterator<E> iterator()
      Description copied from class: ImmutableCollection
      Returns an unmodifiable iterator across the elements in this collection.
      Specified by:
      iterator in interface Collection<E>
      Specified by:
      iterator in interface Iterable<E>
      Specified by:
      iterator in interface Set<E>
      Specified by:
      iterator in class ImmutableCollection<E>
    • writeReplace

      Object writeReplace()
    • builder

      public static <E> ImmutableSet.Builder<E> builder()
      Returns a new builder. The generated builder is equivalent to the builder created by the ImmutableSet.Builder constructor.
    • builderWithExpectedSize

      @Beta public static <E> ImmutableSet.Builder<E> builderWithExpectedSize(int expectedSize)
      Returns a new builder, expecting the specified number of distinct elements to be added.

      If expectedSize is exactly the number of distinct elements added to the builder before ImmutableSet.Builder.build() is called, the builder is likely to perform better than an unsized builder() would have.

      It is not specified if any performance benefits apply if expectedSize is close to, but not exactly, the number of distinct elements added to the builder.

      Since:
      23.1
    • rebuildHashTable

      static Object[] rebuildHashTable(int newTableSize, Object[] elements, int n)
      Builds a new open-addressed hash table from the first n objects in elements.
    • chooseTableSize

      static int chooseTableSize(int setSize)
      Returns an array size suitable for the backing array of a hash table that uses open addressing with linear probing in its implementation. The returned size is the smallest power of two that can hold setSize elements with the desired load factor. Always returns at least setSize + 2.
    • hashFloodingDetected

      static boolean hashFloodingDetected(Object[] hashTable)
      Checks the whole hash table for poor hash distribution. Takes O(n) in the worst case, O(n / log n) on average.

      The online hash flooding detecting in RegularSetBuilderImpl.add can detect e.g. many exactly matching hash codes, which would cause construction to take O(n^2), but can't detect e.g. hash codes adversarially designed to go into ascending table locations, which keeps construction O(n) (as desired) but then can have O(n) queries later.

      If this returns false, then no query can take more than O(log n).

      Note that for a RegularImmutableSet with elements with truly random hash codes, contains operations take expected O(1) time but with high probability take O(log n) for at least some element. (https://en.wikipedia.org/wiki/Linear_probing#Analysis)

      This method may return true up to HASH_FLOODING_FPP of the time even on truly random input.

      If this method returns false, there are definitely no runs of length at least maxRunBeforeFallback(hashTable.length) nonnull elements. If there are no runs of length at least maxRunBeforeFallback(hashTable.length) / 2 nonnull elements, this method definitely returns false. In between those constraints, the result of this method is undefined, subject to the above HASH_FLOODING_FPP constraint.

    • maxRunBeforeFallback

      private static int maxRunBeforeFallback(int tableSize)
      If more than this many consecutive positions are filled in a table of the specified size, report probable hash flooding. (hashFloodingDetected(java.lang.Object[]) may also report hash flooding if fewer consecutive positions are filled; see that method for details.)