Skip to content

Block-List<T>

This content is not available in your language yet.

BlockList 是一种基于分块技术的线性容器。与通用的 BlockArray 不同,BlockList 通过放弃批量插入的能力,只提供了较快的单点插入功能。保证了访问效率始终为 O(1),且效率与原生数组一致。通过分块技术,我们可以分摊内存重排的开销,将插入、删除的复杂度维持在 O(B/w + N/B)。见 基准测试

export class BlockList<T> extends InternalIterable<T>;
方法描述
constructor(blockSize = 512)构造实例。blockSize (即 B) 会被自动向上取整到 2 的幂。
方法描述复杂度
at(index)访问指定位置的元素,支持负数索引。O(1)
get(index)访问指定位置的元素。O(1)
set(index, value)替换指定位置的元素。O(1)
方法描述复杂度
push(…values)在末尾添加元素。O(1)
pushAll(values[])在末尾添加元素,参数为数组。O(1)
pop()弹出末尾元素。O(1)
shift()弹出头部元素。O(B + N/B)
unshift(…values)在头部插入一个或多个元素。O(K · N/B)
insert(index, value)在指定位置插入。O(B + N/B)
delete(index)删除指定位置的元素,并返回它。O(B + N/B)
deleteCursor(cur)删除游标指向的元素,并返回它。O(B + N/B)
方法描述复杂度
splice(start, count?, …items)切片修改. 支持批量删除和插入.O(K · N/B)
spliceAll(start, count?, items[])切片修改. 支持批量删除和插入.O(K · N/B)
slice(start?, end?)返回一个指定范围的浅拷贝 BlockListO(K)
concat(…items)拼接元素、数组、或 BlockList
返回一个新的 BlockList
O(K)
reverse()原地反转容器内的所有元素。O(N)
rebase(newBlockSize?)重新组织底层块存储。修改 blockSizeO(N)
方法描述
cursor(index = 0)返回一个指向指定索引的双向随机访问游标。
[Symbol.iterator]()返回原生迭代器,支持 for..of 循环。
方法描述复杂度
length返回元素总数。O(1)
capacity返回当前对象池能容纳的最大元素数(无新分配)。O(1)
isEmpty()检查列表是否为空。O(1)
resize(newSize, fillValue?)调整容器大小。缩小时截断数据,扩大时填充 fillValueO(K)
reserve(n)预分配物理块,确保至少能容纳 n 个元素。O(N)
shrinkToFit()释放内存池中闲置的物理块,等待 GC。O(1)
clear(reuse = true)清空容器。reuse 为时将物理块回收进对象池。O(1) 或 O(N)

clear 在 resue = true 时,效率为 O(N),并将解除对用户数据的引用。