考虑以下代码:
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(使用前将#替换为@)