are*_*res 25 java collections variadic-functions java-9
Java 9附带了用于创建不可变列表的便捷工厂方法.最后,列表创建非常简单:
List<String> list = List.of("foo", "bar");
Run Code Online (Sandbox Code Playgroud)
但是这个方法有12个重载版本,11个有0到10个元素,另一个有var args.
static <E> List<E> of(E... elements)
Run Code Online (Sandbox Code Playgroud)
同样是与案件Set和Map.
由于存在var args方法,有多少11种方法有什么意义呢?
我认为var-args创建一个数组,所以其他11个方法可以跳过创建一个额外的对象,在大多数情况下会有0-10个元素.还有其他原因吗?
Nam*_*man 26
来自JEP文档本身 -
描述 -
这些将包括varargs重载,因此对集合大小没有固定限制.但是,如此创建的集合实例可以针对较小的尺寸进行调整.将提供最多十个元素的特殊情况API(固定参数重载).虽然这会在API中引入一些混乱,但它避免了varargs调用引起的数组分配,初始化和垃圾收集开销.值得注意的是,无论是否调用fixed-arg或varargs重载,调用站点的源代码都是相同的.
编辑 - 为了增加动力,正如@CKing在评论中已提到的那样:
非目标 -
支持具有任意数量元素的高性能,可伸缩集合并非目标.重点是小集合.
动机 -
创建一个小的,不可修改的集合(比如一组)包括构造它,将它存储在局部变量中,并在其上多次调用add(),然后将其包装起来.
Set<String> set = Collections.unmodifiableSet(new HashSet<>(Arrays.asList("a", "b", "c")));
Run Code Online (Sandbox Code Playgroud)
通过组合流工厂方法和收集器,Java 8 Stream API可用于构建小型集合.
// Java 8
Set<String> set1 = Collections.unmodifiableSet(Stream.of("a", "b", "c").collect(Collectors.toSet()));
Run Code Online (Sandbox Code Playgroud)
通过提供用于创建小型集合实例的库API,与更改语言相比,成本和风险显着降低,可以获得集合文字的大部分好处.例如,创建小型Set实例的代码可能如下所示:
// Java 9
Set set2 = Set.of("a", "b", "c");
Run Code Online (Sandbox Code Playgroud)
Mur*_*nik 10
如您所料,这是性能增强.Vararg方法在"引擎盖下"创建一个数组,并且具有直接采用1-10个参数的方法避免了这种冗余的数组创建.
您可能会发现Josh Bloch的Effective Java(第2版)第42项的以下段落具有启发性:
每次调用varargs方法都会导致数组分配和初始化.如果你根据经验确定你不能承担这笔费用,但你需要varargs的灵活性,有一种模式可以让你吃蛋糕并吃掉它.假设您已确定95%的方法调用具有三个或更少的参数.然后声明方法的五个重载,一个用零到三个普通参数,以及一个varargs方法,当参数个数超过三个时使用[...]
| 归档时间: |
|
| 查看次数: |
1801 次 |
| 最近记录: |