为什么我在调用第一个具有大数的函数(例如2000)并且第二个实现没有错误时,得到java.lang.OutOfMemoryError:Java堆空间?
两者不会保留相同的内存量吗?
object TailRecursion extends App{
@tailrec
def repeatString (str: String, n:Integer ): String = {
if (n == 0) ""
else if (n == 1) str
else repeatString(str+str, n-1)
}
@tailrec
def repeatString(str:String, n:Integer, accumulator:String):String ={
if(n==0) accumulator
else repeatString(str, n-1, str+accumulator)
}
println(repeatString("teste", 0))
println(repeatString("teste", 1))
println(repeatString("teste", 2))
println(repeatString("teste", 2000))
}
不会。两者都不会保留相同的内存量。
让我们尝试OutOfMemory
使用Scala中的for表达式执行出错的操作。它将大致翻译为以下代码:
def repeatStringLoop(string: String, n: Integer): String = {
var resultString = string
if (n == 0) ""
else if (n == 1) string
else {
for (i <- 0 until n) {
resultString = resultString.concat(resultString)
}
resultString
}
}
如果运行代码,它将抛出相同的错误。这是因为您尝试将每个修改后的字符串连接两次-导致占用更多内存-这与将字符串“ teste”连接到结果字符串不同。
但是,最好将StringBuilder
这种字符串连接使用。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句