> Hi all, > > the current implementation of Set.copyOf(Collection<? extends E> coll) > creates an intermediate HashSet object to remove duplicates even when > coll is already a Set. The attached patch adds an additional check > whether coll is already a Set and if yes, then calls #toArray() > directly on coll and passes the result to Set.of().
It looks like my patch was stripped. Now inlined: diff --git a/src/java.base/share/classes/java/util/Set.java b/src/java.base/share/classes/java/util/Set.java --- a/src/java.base/share/classes/java/util/Set.java +++ b/src/java.base/share/classes/java/util/Set.java @@ -723,6 +723,8 @@ static <E> Set<E> copyOf(Collection<? extends E> coll) { if (coll instanceof ImmutableCollections.AbstractImmutableSet) { return (Set<E>)coll; + } else if (coll instanceof Set<?>) { + return (Set<E>)Set.of(coll.toArray()); } else { return (Set<E>)Set.of(new HashSet<>(coll).toArray()); }