当前位置: 首页 > 面试题库 >

如果元素重复,为什么Set.of()抛出IllegalArgumentException?

周凯捷
2023-03-14
问题内容

在Java 9中,在Set接口上引入了称为of()的新静态工厂方法,该方法接受多个元素,甚至是元素数组。

我想将一个列表变成一个集合,以删除集合中的所有重复条目,这可以使用以下方法完成(在Java 9之前):

Set<String> set = new HashSet<>();
set.addAll(list);

但是我认为使用这种新的Java 9静态工厂方法很酷:

Set.of(list.toArray())

其中list是先前定义的字符串列表。

但是,可惜的是,IllegalArgumentException当元素重复时,java抛出了一个,该方法的Javadoc中也对此做了说明。为什么是这样?

编辑
:此问题不是有关概念上等效的主题Map.of()方法的另一个问题的重复,但有明显不同。并非所有静态工厂of()方法的行为都相同。换句话说,当我询问有关Set.of()方法的问题时,我不会单击涉及Map.of()方法的问题。


问题答案:

对于 给定* 数量的元素,Set.of()工厂方法产生不可变Set的。 *

在变型的支持的参数固定数量(static <E> Set<E> of​()static <E> Set<E> of​(E e1)static <E> Set<E> of​(E e1,E e2),等…),不必重复是容易理解的需求-
当你调用这个方法Set.of(a,b,c),你说明你希望创建一个不变Set正是
3个要素,因此,如果参数包含重复项,则拒绝输入而不是产生较小的有意义Set

尽管Set<E> of​(E... elements)变体不同(如果允许创建Set任意数量的元素),则其遵循与其他变体相同的逻辑。如果将n元素传递给该方法,则说明您希望创建一个不可变Set
精确 n元素,因此不允许重复。

您仍然可以使用以下内容Set在一个内联代码中List(有可能重复)创建一个:

Set<String> set = new HashSet<>(list);

在Java 9之前已经可用。



 类似资料: