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