流非常适合函数式编程和可读性,但当性能是主要问题时应避免使用。他们创建了不必要的额外对象。
同样令人惊讶的是,双原始类型的数组比它们的包装类双数组消耗更多的内存(参考:https ://www.baeldung.com/java-primitives-vs-objects )
使用Double
对象数组而不是双原语,然后运行:
Collection<Double> l = Collections.unmodifiableCollection(Arrays.asList(myArray));
我比较了这两种方法
public static void main(String[] args) {
int len = 1000000;
Double[] myArray = new Double[len];
for (int i = 0; i < len; i++) {
myArray[i] = Math.random();
}
Collection<Double> l = Collections.unmodifiableCollection(Arrays.asList(myArray));
long totalMem = Runtime.getRuntime().totalMemory();
long usedMem = totalMem - Runtime.getRuntime().freeMemory();
System.out.println("totalMem="+humanReadableByteCountBin(totalMem));
System.out.println("usedMem=" + humanReadableByteCountBin(usedMem));
System.out.println("l has " + l.size() + " items ");
}
流方法使用 48Mb,而Arrays.asList
Double 使用 28Mb。