Why does Set.of disallow duplicate elements?

Remi Forax forax at univ-mlv.fr
Sat Jan 30 20:30:04 UTC 2021

Set.of() is the closest way we've got to a literal Set without having introduced a special syntax for that in the language.

The idea is that if you conceptually want to write
  Set<String> set = { "hello", "world" };
instead, you write
  Set<String> set = Set.of("hello", "world");

In that context, it makes sense to reject Set constructed with the same element twice because this is usually a programming error.
  Set.of("hello", "hello")
throws an IAE.

If you want a Set from a collection of elements, you can use
  Set.copyOf(List.of("hello", "hello"))


----- Mail original -----
> De: "dfranken jdk" <dfranken.jdk at gmail.com>
> À: "core-libs-dev" <core-libs-dev at openjdk.java.net>
> Envoyé: Samedi 30 Janvier 2021 19:30:06
> Objet: Why does Set.of disallow duplicate elements?

> Dear users,
> While looking at the implementation of Set.of(...) I noticed that
> duplicate elements are not allowed, e.g. Set.of(1, 1) will throw an
> IllegalArgumentException. Why has it been decided to do this?
> My expectation was that duplicates would simply be removed.
> If I do for instance new HashSet<>(<collection containing duplicates>)
> it works and duplicates are removed. To me, it looks a bit inconsistent
> to have duplicates removed for a collection passed in the constructor,
> but not for a collection (even though it is a vararg array) passed to a
> static factory method.
> Kind regards,
> Dave Franken

More information about the core-libs-dev mailing list