首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java 9中的集合重载方便工厂方法的意义是什么?

Java 9中的集合重载方便工厂方法的意义是什么?
EN

Stack Overflow用户
提问于 2017-01-29 08:20:52
回答 6查看 3.7K关注 0票数 42

Java9附带了用于创建不可变列表的方便工厂法。最后,列表创建非常简单,如:

代码语言:javascript
复制
List<String> list = List.of("foo", "bar");

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

代码语言:javascript
复制
static <E> List<E>  of(E... elements)

SetMap的情况也是如此。

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

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

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2017-01-29 08:27:19

来自JEP文档本身-

Description -

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

编辑-添加动机,就像@CKing在评论中提到的那样:

非进球-

它不是支持具有任意数量的元素的高性能、可伸缩集合的目标。关注的焦点是小集合。

动机-

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

代码语言:javascript
复制
Set<String> set = Collections.unmodifiableSet(new HashSet<>(Arrays.asList("a", "b", "c")));

通过将流工厂方法和收集器结合起来,Java8StreamAPI可以用于构造小型集合。

代码语言:javascript
复制
// Java 8
Set<String> set1 = Collections.unmodifiableSet(Stream.of("a", "b", "c").collect(Collectors.toSet()));

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

代码语言:javascript
复制
// Java 9 
Set set2 = Set.of("a", "b", "c");
票数 34
EN

Stack Overflow用户

发布于 2017-01-29 08:25:38

正如你所怀疑的,这是一种性能提升。Vararg方法创建一个“隐藏之下”数组,而直接使用1-10个参数的方法避免了这种冗余数组的创建。

票数 11
EN

Stack Overflow用户

发布于 2017-01-29 15:25:51

您可以找到乔希·布洛赫的“有效Java”(第二版)第42项的以下段落。启发:

每次调用varargs方法都会导致数组分配和初始化。如果你已经根据经验确定了你负担不起这个成本,但你需要的灵活性,瓦拉格,有一个模式,让你有你的蛋糕和吃它。假设您已经确定95 %的方法调用都有三个或更少的参数。然后声明该方法的五个重载,其中一个具有零到三个普通参数,以及一个varargs方法,以便在参数数超过三个时使用。

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41918934

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档