Collection.toArray() 与 Collection.stream().toArray()

2023-12-08

考虑以下代码:

List<String> myList = Arrays.asList(1, 2, 3);
String[] myArray1 = myList.toArray(new String[myList.size()]);
String[] myArray2 = myList.stream().toArray(String[]::new);
assert Arrays.equals(myArray1, myArray2);

在我看来,使用流要简单得多。

Therefore, I tested the speed of each.

List<String> myList = Arrays.asList("1", "2", "3");
double start;

start = System.currentTimeMillis();
for (int i = 0; i < 10_000_000; i++) {
    String[] myArray1 = myList.toArray(new String[myList.size()]);
    assert myArray1.length == 3;
}
System.out.println(System.currentTimeMillis() - start);

start = System.currentTimeMillis();
for (int i = 0; i < 10_000_000; i++) {
    String[] myArray2 = myList.stream().toArray(String[]::new);
    assert myArray2.length == 3;
}
System.out.println(System.currentTimeMillis() - start);

结果是使用流的速度大约慢四倍。在我的机器上,816 毫秒(流)与 187 毫秒(无流)。我还尝试切换时序语句(myArray2 先于 myArray1),这对结果影响不大。为什么这么慢?正在创建一个Stream计算量这么大?


Arrays.asList()创建一个固定大小的List它直接由 varargs 数组参数支持。 Javadoc 甚至这样说:

返回由指定数组支持的固定大小列表。

其实施toArray()是一个简单的System.arraycopy(). 非常快.

另一方面,当你这样做时myList.stream().toArray(String[]::new),尺寸未知,因此Stream.toArray()方法必须消耗流,收集所有值,then创建数组并将值复制到数组中。那是很多slower,并且需要很多更多内存.

简而言之,这是一种资源浪费。

如果你想simpler,只是不给出数组大小。与使用 Stream 相比,它仍然更快、占用的内存更少:

String[] myArray1 = myList.toArray(new String[0]);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Collection.toArray() 与 Collection.stream().toArray() 的相关文章

随机推荐