我理解scala中的视图结构的方式是视图是一个惰性集合,并且在访问之前没有填充真正的集合成员。 通过对视图的这种描述,以下代码行不应该抛出错误:
val a = (0 to 123456789).view
并且正如预期的那样。我(很可能错误地)假设以下代码行等同于上面的代码,并且不应该抛出内存不足错误:
val a = Array.range(0,123456789).view
但它会生成“java.lang.OutOfMemoryError:Java堆空间”错误。知道为什么这两行代码行为不同吗?
答案 0 :(得分:3)
让我们分手吧......
val a1: Range.Inclusive = (0 to 123456789)
val a2: AnyRef with SeqView[Int, IndexedSeq[Int]] = a1.view
val b1: Array[Int] = Array.range(0,123456789)
val b2: AnyRef with mutable.IndexedSeqView[Int, Array[Int]] = b1.view
IntelliJ推断(按Ctr-Q )b1是一个数组。
让我们查看" Array.range" ...
的文档 /** Returns an array containing a sequence of increasing integers in a range.
*
* @param start the start value of the array
* @param end the end value of the array, exclusive (in other words, this is the first value '''not''' returned)
* @return the array with values in range `start, start + 1, ..., end - 1`
* up to, but excluding, `end`.
*/
def range(start: Int, end: Int): Array[Int] = range(start, end, 1)
错误来自您致电Array.range
...
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at scala.collection.mutable.ArrayBuilder$ofInt.mkArray(ArrayBuilder.scala:323)
at scala.collection.mutable.ArrayBuilder$ofInt.resize(ArrayBuilder.scala:329)
at scala.collection.mutable.ArrayBuilder$ofInt.sizeHint(ArrayBuilder.scala:334)
at scala.Array$.range(Array.scala:402)
at scala.Array$.range(Array.scala:390)
at pkg.Main$.main(Main.scala:57)
at pkg.Main.main(Main.scala)
您刚刚分配了一个包含123456790个元素的数组,这就是您遇到“java.lang.OutOfMemoryError:Java堆空间”错误的原因。