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

Java 9中集合的重载便利工厂方法的重点是什么

闻人河
2023-03-14
问题内容

Java 9带有用于创建不可变列表的便捷工厂方法。最后,创建列表很简单:

List<String> list = List.of("foo", "bar");

但是此方法有12个重载版本,其中11个包含0到10个元素,而一个具有var args。

static <E> List<E>  of(E... elements)

同样是与案件Set和Map。

既然有一个var args方法,那么拥有额外的11种方法有什么意义呢?

我认为是var-args创建一个数组,因此其他11种方法可以跳过创建额外对象的过程,并且在大多数情况下,可以使用0-10个元素。还有其他原因吗?


问题答案:

从JEP文档本身-

说明-

这些将包括varargs重载,因此对集合大小没有固定的限制。但是,可以将这样创建的集合实例调整为较小的大小。将提供最多十个元素的特殊情况的API(固定参数重载)。虽然这在API中引入了一些混乱,但它避免了由varargs调用引起的数组分配,初始化和垃圾回收开销。重要的是,无论调用了fixed-arg还是varargs重载,调用站点的源代码都是相同的。

编辑-要添加动力,也已通过@CKing在评论中提到:

非目标-

支持具有任意数量的元素的高性能,可伸缩集合不是目标。重点是小收藏。

动机-

创建一个小的,不可修改的集合(例如,一个集合)包括构造它,将其存储在局部变量中,并对其多次调用add(),然后将其包装。

Set<String> set = Collections.unmodifiableSet(new HashSet<>(Arrays.asList("a", "b", "c")));

通过结合流工厂方法和收集器,可以使用Java 8 Stream API来构建小型收集。

// Java 8
Set<String> set1 = Collections.unmodifiableSet(Stream.of("a", "b", "c").collect(Collectors.toSet()));

通过提供用于创建小型集合实例的库API可以获得集合文字的大部分好处,与更改语言相比,这些API的成本和风险大大降低。例如,创建一个小的Set实例的代码可能如下所示:

// Java 9 
Set set2 = Set.of("a", "b", "c");


 类似资料:
  • Java9提供了创建不可变列表的便利工厂方法。最后,创建列表非常简单: 但是这种方法有12个重载版本,11个有0到10个元素,一个有var args。 和的情况也是如此。 既然有一个var-args方法,那么有额外的11个方法有什么意义呢? 我认为var args创建一个数组,所以其他11个方法可以跳过额外对象的创建,在大多数情况下,0-10个元素就可以了。还有其他原因吗?

  • 在Java9中,我们有方便的工厂方法来创建和实例化不可变的List、Set和map。

  • 在Java 9中,新的工厂方法被添加到,和接口来创建不可变的实例。 这些工厂方法是便捷的工厂方法,以较简洁的方式创建集合。 旧的方式创建集合 执行上面示例代码,得到以下结果 - 新方法 使用java 9,以下方法将被添加到,和接口以及它们的重载对象。 注意事项 对于和接口,方法重载为到个参数,另一个使用参数。 对于接口,方法重载为有到个参数。 如果接口的参数超过个,则可以使用方法接受参数。 创建集

  • 问题内容: 在Java 9中,我们有方便的工厂方法来创建和实例化不可变的List,Set和Map。 但是,不清楚返回对象的具体类型。 例如: 在这种情况下,实际上返回的是哪种类型的列表?它是ArrayList还是LinkedList还是其他某种类型的List? API文档仅提及此行,而没有明确提及其LinkedList: 列表中元素的顺序与提供的参数或提供的数组中的元素的顺序相同。 问题答案: 返

  • 问题内容: 有人告诉我Activity.findViewById(int)方法是一种方便的方法,它在后台调用View.findViewById(int)。 我找不到任何说明Java便捷方法的文档(我只能看到iOS)。 PS:我在粗略的Google搜索过程中或通过SO prev帖子找不到任何答案。如果已经有答案了,请关闭该答案。 问题答案: 任何一种具有方法概念的语言中的便捷方法就是这样。一种使事情

  • 在Java 9中,在列表界面下,有一个新的()方法,根据Java文档: 名单。of()静态工厂方法提供了一种创建不可变列表的方便方法。