Hello! What if it's TreeSet with custom comparator which may differentiate elements equal by .equals()? Or, even simpler, Collections.newSetFromMap(new IdentityHashMap<>())? In both cases Set.of(array) would throw.
With best regards, Tagir Valeev. On Fri, Jun 22, 2018 at 4:43 PM Andrej Golovnin <andrej.golov...@gmail.com> wrote: > > 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()); > } >