我正在对Scala中的数组进行分析。我正在按照一本书(Robert W. Sebesta的编程语言概念)进行这种分析。根据该书,有五类数组,基于对下标范围的绑定,对存储的绑定以及存储分配的位置。类别是:
静态数组:其中下标范围是静态绑定的,存储分配是静态的(在运行时之前完成)。静态数组的优点是效率:不需要动态分配或释放。缺点是阵列的存储在程序的整个执行时间内是固定的。
fixed stack-dynamic array :下标范围是静态绑定的,但分配是在执行期间的声明详细时间完成的。固定堆栈动态阵列优于静态阵列的优点是空间效率。只要两个子程序同时不活动,一个子程序中的大数组就可以在不同的子程序中使用相同的空间作为大数组。如果两个阵列位于同时不活动的不同块中,则情况也是如此。缺点是所需的分配和释放时间。
stack-dynamic array :是指在精化时动态绑定下标范围和存储分配的数组。但是,一旦下标范围被绑定并且分配了存储,它们在变量的生命周期内保持固定。堆栈动态阵列优于静态和固定堆栈动态阵列的优势在于灵活性。在即将使用该阵列之前,无需知道阵列的大小。
固定堆动态数组:类似于固定堆栈动态数组,因为下标范围和存储绑定在分配存储后都是固定的。不同之处在于,下标范围和存储绑定都是在用户程序在执行期间请求它们时完成的,并且存储是从堆而不是堆栈分配的。固定堆动态数组的优点是灵活性 - 数组的大小始终适合问题。缺点是来自堆的分配时间比堆栈的分配时间长。
堆动态数组:下标范围和存储分配的绑定是动态的,并且在数组生命周期内可以更改任意次数。堆动态数组优于其他数组的优点是灵活性:随着空间需求的变化,数组可以在程序执行期间增长和缩小。缺点是分配和解除分配需要更长的时间,并且可能在程序执行期间多次发生。五个类别的示例在以下段落中给出。
答案 0 :(得分:9)
Scala和Java都在原始数组上使用fixed heap-dynamic array
。有一些类,例如Java的Vector
和Scala的ArrayBuffer
,它们构建在基元上,以提供heap-dynamic array
的特征。