RFR: 8302818: Optimize wrapper sets and immutable sets of Enums

ExE Boss duke at openjdk.org
Mon Feb 20 12:15:36 UTC 2023


On Thu, 9 Feb 2023 16:20:31 GMT, Tingjun Yuan <duke at openjdk.org> wrote:

> Currently, the two subclasses of `java.util.EnumSet` optimize bulk operations when the argument is also a `EnumSet`, but there is no such optimization for wrapper sets (returned by `Collections.unmodifiableSet`, `Collections.synchronizedSet`, etc.) and immutable sets (returned by `Set.of` methods) of `Enum`s.
> 
> This PR introduces optimization classes for these situations.  No public APIs are changed.

src/java.base/share/classes/java/util/Collections.java line 1152:

> 1150:         if (s.getClass() == UnmodifiableSet.class) {
> 1151:             return (Set<T>) s;
> 1152:         }

To avoid re‑wrapping already unmodifiable `EnumSet`s, this should also check for those:
Suggestion:

        if (s.getClass() == UnmodifiableSet.class
            || s.getClass() == UnmodifiableRegularEnumSet.class
            || s.getClass() == UnmodifiableJumboEnumSet.class) {
            return (Set<T>) s;
        }

src/java.base/share/classes/java/util/Collections.java line 1158:

> 1156:         if (s instanceof JumboEnumSetCompatible) {
> 1157:             return (Set<T>)new UnmodifiableJumboEnumSet<>((JumboEnumSetCompatible<?>)s);
> 1158:         }

Suggestion:

        if (s.getClass() == UnmodifiableSet.class
            || s.getClass() == UnmodifiableRegularEnumSet.class
            || s.getClass() == UnmodifiableJumboEnumSet.class) {
            return (Set<T>) s;
        }
        if (s instanceof RegularEnumSetCompatible<?> es) {
            return (Set<T>) new UnmodifiableRegularEnumSet<>(es);
        }
        if (s instanceof JumboEnumSetCompatible<?> es) {
            return (Set<T>) new UnmodifiableJumboEnumSet<>(es);
        }

-------------

PR: https://git.openjdk.org/jdk/pull/12498


More information about the core-libs-dev mailing list