我有这个问题:我想迭代满足某些条件的数组元素。
我最初想到的是在原始数组上使用filter方法,然后对结果元素进行迭代。但是我遇到了一些内存使用问题,即Java堆空间溢出。 当应用filter于一个数组时,它会实例化一个新数组吗?所以它会复制每个元素吗?
是否更好使用这种方法:
还是下面这个呢?
此外,我写了这两个测试:
使用for
我使用VisualVM检查了内存使用情况,似乎第一种解决方案比第二种解决方案使用了更少的内存。
这是第一种解决方案使用的内存 这是第二种解决方案使用的内存
我最初想到的是在原始数组上使用filter方法,然后对结果元素进行迭代。但是我遇到了一些内存使用问题,即Java堆空间溢出。 当应用filter于一个数组时,它会实例化一个新数组吗?所以它会复制每个元素吗?
是否更好使用这种方法:
array.filter(<condition>).foreach{ element =>
do something
}
还是下面这个呢?
for(i <- array.indices if <condition>){
do something
}
此外,我写了这两个测试:
使用for
val size = 10000000
val elements = Array.ofDim[Double](size)
for (i <- elements.indices) {
elements.update(i, math.random)
}
var cont = 0
val n = 0.5
while(true){
cont = 0
for (j <- elements.indices if elements(j) < n) {
cont += 1
}
println(cont)
}
使用 过滤器
val size = 10000000
val elements = Array.ofDim[Double](size)
for (i <- elements.indices) {
elements.update(i, math.random)
}
val n = 0.5
while(true){
val valid = elements.filter(x => x < n)
println(valid.size)
}
我使用VisualVM检查了内存使用情况,似乎第一种解决方案比第二种解决方案使用了更少的内存。
这是第一种解决方案使用的内存 这是第二种解决方案使用的内存