当前位置: 首页 > 知识库问答 >
问题:

什么是超载的便利工厂收集方法在Java9

岳嘉容
2023-03-14

Java9提供了创建不可变列表的便利工厂方法。最后,创建列表非常简单:

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

但是这种方法有12个重载版本,11个有0到10个元素,一个有var args。

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

SetMap的情况也是如此。

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

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

共有3个答案

严朝明
2023-03-14

你可能会发现乔希·布洛赫(Josh Bloch)的《有效的Java》(第二版)第42项的以下段落很有启发性:

每次调用varargs方法都会导致数组分配和初始化。如果你根据经验确定你负担不起这个成本,但你需要Varags的灵活性,那么有一种模式可以让你既吃蛋糕,又吃蛋糕。假设您已经确定95%的方法调用具有三个或更少的参数。然后声明该方法的五个重载,其中一个重载通过三个普通参数分别为零,另一个重载是一个varargs方法,用于参数数超过三个[…]时使用

史谦
2023-03-14

正如您所怀疑的,这是一种性能增强。Vararg方法在“引擎盖下”创建一个数组,并且使用1-10个参数的方法直接避免了这种冗余的数组创建。

井疏珂
2023-03-14

来自JEP文件本身-

描述-

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

编辑-添加动机,正如@CKing的评论中已经提到的:

非目标-

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

动机-

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

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

Java8 Stream API可用于通过组合流工厂方法和收集器来构建小型收集。

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

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

// Java 9 
Set set2 = Set.of("a", "b", "c");
 类似资料:
  • 问题内容: Java 9带有用于创建不可变列表的便捷工厂方法。最后,创建列表很简单: 但是此方法有12个重载版本,其中11个包含0到10个元素,而一个具有var args。 同样是与案件Set和Map。 既然有一个var args方法,那么拥有额外的11种方法有什么意义呢? 我认为是var-args创建一个数组,因此其他11种方法可以跳过创建额外对象的过程,并且在大多数情况下,可以使用0-10个元

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

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

  • 本文向大家介绍iOS类工厂方法是什么 ?相关面试题,主要包含被问及iOS类工厂方法是什么 ?时的应答技巧和注意事项,需要的朋友参考一下 类工厂方法的实现是为了向客户提供方便,它们将分配和初始化合在一个步骤中,返回被创建的对象,并 进行自动释放处理。这些方法的形式是+ (type)className...(其中 className不包括任何前缀)。 工厂方法可能不仅仅为了方便使用。它们不但可以将分配

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

  • 问题内容: 什么是静态工厂方法? 问题答案: 我们避免直接访问数据库连接,因为它们占用大量资源。因此,如果我们低于限制,我们将使用静态工厂方法来创建连接。否则,它将尝试提供“备用”连接,如果不存在则失败,并显示异常。