跳到主要内容

共享容器

ArkTS容器集

ArkTS共享容器(@arkts.collections (ArkTS容器集))是一种在并发实例间共享传输的容器类,用于并发场景下的高性能数据传递。它的功能与ECMAScript 262规范定义的容器类似,但存在部分差异,具体可见共享容器与原生API方法的行为差异对比

ArkTS共享容器在多个并发实例间传递时,默认采用引用传递,允许多个并发实例操作同一容器实例。此外,还支持拷贝传递,即每个并发实例拥有独立的ArkTS容器实例。

ArkTS共享容器不是线程安全的,内部使用了fail-fast(快速失败)机制,即当检测到多个并发实例同时对容器进行结构性修改时,会触发异常。因此,在多线程场景下修改容器内属性时,开发者需要使用ArkTS提供的异步锁机制保证ArkTS容器的安全访问。

ArkTS共享容器包含如下几种:ArrayMapSet、TypedArray(Int8ArrayUint8ArrayInt16ArrayUint16ArrayInt32ArrayUint32ArrayUint8ClampedArrayFloat32Array)、ArrayBufferBitVectorConcatArray,具体可见@arkts.collections (ArkTS容器集)

容器集使用示例如下:

import { ArkTSUtils, collections, taskpool } from '@kit.ArkTS';

@Concurrent
async function add(arr: collections.Array<number>, lock: ArkTSUtils.locks.AsyncLock) {
await lock.lockAsync(() => { // 如果不添加异步锁,任务会因为数据竞争冲突,导致抛异常失败
arr[0]++;
})
}

@Entry
@Component
struct Index {
@State message: string = 'Hello World';

build() {
RelativeContainer() {
Text(this.message)
.id('HelloWorld')
.fontSize(50)
.fontWeight(FontWeight.Bold)
.alignRules({
center: { anchor: '__container__', align: VerticalAlign.Center },
middle: { anchor: '__container__', align: HorizontalAlign.Center }
})
.onClick(() => {
let taskGroup = new taskpool.TaskGroup();
let lock = new ArkTSUtils.locks.AsyncLock();
let arr = collections.Array.create<number>(1, 0);
let count = 1000;
let num = count;
while (num--) {
taskGroup.addTask(add, arr, lock);
}
taskpool.execute(taskGroup).then(() => {
console.info(`Return success: ${arr[0]} === ${count}`);
}).catch((e: Error) => {
console.error("Return error.");
})
})
}
.height('100%')
.width('100%')
}
}

共享容器与原生API方法的行为差异对比

ArkTS提供了Sendable数据相关的共享容器集,接口行为与原生API存在部分差异,具体见下文对比。

ArkTS共享容器的类型与ECMAScript 262规范定义的原生容器类型不同,因此使用原生容器Array的isArray()方法判断collections.Array实例对象会返回false。

ArkTS共享容器采用引用传递方式跨线程传递,与原生容器相比效率更高。如果需要跨线程传输大量数据,建议使用ArkTS共享容器。

Array

支持通过collections.Array.from方法将原生容器Array转换为ArkTS Array容器;支持通过原生容器Array的from方法将 ArkTS Array容器转换为原生容器Array。

原生API方法ArkTS容器集方法是否有行为差异在ArkTS容器中的差异表现
length: numberreadonly length: number为了防止undefined扩散,不允许设置length。
new(arrayLength ?: number): any[]static create(arrayLength: number, initialValue: T): Array为了防止undefined扩散,构造函数中必须提供一个初始值。
new (arrayLength: number): T[]constructor()构造时传入的数据必须为Sendable类型,否则将导致编译错误。
new (...items: T[]): T[]constructor(first: T, ...left: T[])为了防止undefined扩散,构造函数中必须提供一个初始值,继承场景下,无法调用该函数进行对象构造。
from<T>(arrayLike: ArrayLike<T>): T[]static from<T>(arrayLike: ArrayLike<T>): Array<T>/
from<T, U>(iterable: Iterable<T>ArrayLike<T>, mapfn: (v: T, k: number) => U, thisArg?: any): U[]static from<U, T>(arrayLike: ArrayLike<U>Iterable<U>, mapFn: ArrayFromMapFn<U, T>): Array<T>
pop(): Tundefinedpop(): Tundefined
push(...items: T[]): numberpush(...items: T[]): number不允许在遍历、访问过程中进行元素的增、删、改操作,否则会抛出异常。
concat(...items: ConcatArray<T>[]): T[]concat(...items: ConcatArray<T>[]): Array<T>不允许在遍历、访问过程中进行元素的增、删、改操作,否则会抛出异常。
concat(...items: (TConcatArray<T>)[]): T[]concat(...items: ConcatArray<T>[]): Array<T>
join(separator?: string): stringjoin(separator?: string): string/
shift(): Tundefinedshift(): Tundefined
slice(start?: number, end?: number): T[]slice(start?: number, end?: number): Array<T>/
sort(compareFn?: (a: T, b: T) => number): thissort(compareFn?: (a: T, b: T) => number): Array<T>1. 不允许在遍历、访问过程中进行元素的增、删、改操作,否则会抛出异常。 2. 继承场景下,无法获得实际类型的返回值。
unshift(...items: T[]): numberunshift(...items: T[]): number不允许在遍历、访问过程中进行元素的增、删、改操作,否则会抛出异常。
indexOf(searchElement: T, fromIndex?: number): numberindexOf(searchElement: T, fromIndex?: number): number/
forEach(callbackfn: (value: T, index: number, array: T[]) => void, thisArg?: any): voidforEach(callbackFn: (value: T, index: number, array: Array<T>) => void): voidArkTS不支持this,因此不支持thisArg参数。
map<U>(callbackfn: (value: T, index: number, array: T[]) => U, thisArg?: any): U[]map<U>(callbackFn: (value: T, index: number, array: Array<T>) => U): Array<U>ArkTS不支持this,因此不支持thisArg参数。
filter(predicate: (value: T, index: number, array: T[]) => unknown, thisArg?: any): T[]filter(predicate: (value: T, index: number, array: Array<T>) => boolean): Array<T>ArkTS不支持this,因此不支持thisArg参数。
reduce(callbackfn: (previousValue: T, currentValue: T, currentIndex: number, array: T[]) => T): Treduce(callbackFn: (previousValue: T, currentValue: T, currentIndex: number, array: Array<T>) => T): T/
reduce<U>(callbackfn: (previousValue: U, currentValue: T, currentIndex: number, array: T[]) => U, initialValue: U): Ureduce<U>(callbackFn: (previousValue: U, currentValue: T, currentIndex: number, array: Array<T>) => U, initialValue: U): U/
[n: number]: T[index: number]: T不允许在遍历、访问过程中进行元素的增、删、改操作,否则会抛出异常。
findIndex(predicate: (value: T, index: number, obj: T[]) => unknown, thisArg?: any): numberfindIndex(predicate: (value: T, index: number, obj: Array<T>) => boolean): numberArkTS不支持this,因此不支持thisArg参数。
fill(value: T, start?: number, end?: number): thisfill(value: T, start?: number, end?: number): Array<T>1. 不允许在遍历、访问过程中进行元素的增、删、改操作,否则会抛出异常。 2. 继承场景下,无法获得实际类型的返回值。
entries(): IterableIterator<[number, T]>entries(): IterableIterator<[number, T]>/
keys(): IterableIterator<number>keys(): IterableIterator<number>/
values(): IterableIterator<T>values(): IterableIterator<T>/
includes(searchElement: T, fromIndex?: number): booleanincludes(searchElement: T, fromIndex?: number): boolean/
at(index: number): Tundefinedat(index: number): Tundefined
isArray(arg: any): arg is any[]static isArray(value: Objectundefinednull): boolean
of<T>(...items: T[]): T[]static of<T>(...items: T[]): Array<T>/
copyWithin(target: number, start: number, end?: number): thiscopyWithin(target: number, start: number, end?: number): Array<T>不允许在遍历、访问过程中进行元素的增、删、改操作,否则会抛出异常。
lastIndexOf(searchElement: T, fromIndex?: number): numberlastIndexOf(searchElement: T, fromIndex?: number): number不允许在遍历、访问过程中进行元素的增、删、改操作,否则会抛出异常。
some(predicate: (value: T, index: number, array: T[]) => unknown, thisArg?: any): booleansome(predicate: ArrayPredicateFn<T, Array<T>>): boolean1. 不允许在遍历、访问过程中进行元素的增、删、改操作,否则会抛出异常。 2.ArkTS不支持this,因此不支持thisArg参数。
reduceRight(callbackfn: (previousValue: T, currentValue: T, currentIndex: number, array: T[]) => T): TreduceRight(callbackFn: ArrayReduceCallback<T, T, Array<T>>): T不允许在遍历、访问过程中进行元素的增、删、改操作,否则会抛出异常。
reduceRight<U>(callbackfn: (previousValue: U, currentValue: T, currentIndex: number, array: T[]) => U, initialValue: U): UreduceRight<U = T>(callbackFn: ArrayReduceCallback<U, T, Array<T>>, initialValue: U): U不允许在遍历、访问过程中进行元素的增、删、改操作,否则会抛出异常。
reverse(): T[]reverse(): Array<T>不允许在遍历、访问过程中进行元素的增、删、改操作,否则会抛出异常。
toString(): stringtoString(): string不允许在遍历、访问过程中进行元素的增、删、改操作,否则会抛出异常。
find(predicate: (value: T, index: number, obj: T[]) => unknown, thisArg?: any): Tundefinedfind(predicate: (value: T, index: number, obj: Array<T>) => boolean): Tundefined
splice(start: number, deleteCount: number, ...items: T[]): T[]splice(start: number, deleteCount: number, ...items: T[]): Array<T>不允许在遍历、访问过程中进行元素的增、删、改操作,否则会抛出异常。
every(predicate: (value: T, index: number, array: T[]) => unknown, thisArg?: any): booleanevery(predicate: ArrayPredicateFn<T, Array<T>>): booleanArkTS不支持this,因此不支持thisArg参数。
toLocaleString(): stringtoLocaleString(): string不允许在遍历、访问过程中进行元素的增、删、改操作,否则会抛出异常。

ArrayBuffer

原生API方法ArkTS容器集方法是否有行为差异在ArkTS容器中的差异表现
readonly byteLength: numberreadonly byteLength: number/
slice(begin: number, end?: number): ArrayBufferslice(begin: number, end?: number): ArrayBuffer/
new(byteLength: number): ArrayBufferconstructor(byteLength: number)/

TypedArray(以Int8Array为例)

支持通过collections.Int8Array.from方法将原生容器Int8Array转换为ArkTS Int8Array容器;也支持通过原生容器 Int8Array的from方法将ArkTS Int8Array容器转换为原生容器Int8Array。

原生API方法ArkTS容器集方法是否有行为差异在ArkTS容器中的差异表现
readonly buffer: ArrayBufferLikereadonly buffer: ArrayBuffer/
readonly byteLength: numberreadonly byteLength: number/
readonly byteOffset: numberreadonly byteOffset: number/
readonly length: numberreadonly length: number/
readonly BYTES_PER_ELEMENT: numberstatic readonly BYTES_PER_ELEMENT: number/
copyWithin(target: number, start: number, end?: number): thiscopyWithin(target: number, start: number, end?: number): Int8Array不允许在遍历、访问过程中进行元素的增、删、改操作,否则会抛出异常。
every(predicate: (value: number, index: number, array: Int8Array) => unknown, thisArg?: any): booleanevery(predicate: TypedArrayPredicateFn<number, Int8Array>): boolean1. 不允许在遍历、访问过程中进行元素的增、删、改操作,否则会抛出异常。 2. ArkTS不支持this,因此不支持thisArg参数。
fill(value: number, start?: number, end?: number): thisfill(value: number, start?: number, end?: number): Int8Array不允许在遍历、访问过程中进行元素的增、删、改操作,否则会抛出异常。
filter(predicate: (value: number, index: number, array: Int8Array) => any, thisArg?: any): Int8Arrayfilter(predicate: TypedArrayPredicateFn<number, Int8Array>): Int8Array1. 不允许在遍历、访问过程中进行元素的增、删、改操作,否则会抛出异常。 2. ArkTS不支持this,因此不支持thisArg参数。
find(predicate: (value: number, index: number, obj: Int8Array) => boolean, thisArg?: any): numberundefinedfind(predicate: TypedArrayPredicateFn<number, Int8Array>): numberundefined
findIndex(predicate: (value: number, index: number, obj: Int8Array) => boolean, thisArg?: any): numberfindIndex(predicate: TypedArrayPredicateFn<number, Int8Array>): numberArkTS不支持this,因此不支持thisArg参数。
forEach(callbackfn: (value: number, index: number, array: Int8Array) => void, thisArg?: any): voidforEach(callbackFn: (value: number, index: number, array: Int8Array) => void): void1. 不允许在遍历、访问过程中进行元素的增、删、改操作,否则会抛出异常。 2. ArkTS不支持this,因此不支持thisArg参数。
indexOf(searchElement: number, fromIndex?: number): numberindexOf(searchElement: number, fromIndex?: number): number/
join(separator?: string): stringjoin(separator?: string): string/
map(callbackfn: (value: number, index: number, array: Int8Array) => number, thisArg?: any): Int8Arraymap(callbackFn: TypedArrayForEachCallback<number, Int8Array>): Int8Array1. 不允许在遍历、访问过程中进行元素的增、删、改操作,否则会抛出异常。 2. ArkTS不支持this,因此不支持thisArg参数。
reduce(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Int8Array) => number): numberreduce(callbackFn: TypedArrayReduceCallback<number, number, Int8Array>): number/
reduce(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Int8Array) => number, initialValue: number): numberreduce(callbackFn: TypedArrayReduceCallback<number, number, Int8Array>, initialValue: number): number/
reduce<U>(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Int8Array) => U, initialValue: U): Ureduce<U>(callbackFn: TypedArrayReduceCallback<U, number, Int8Array>, initialValue: U): U/
reverse(): Int8Arrayreverse(): Int8Array/
set(array: ArrayLike<number>, offset?: number): voidset(array: ArrayLike<number>, offset?: number): void不允许在遍历、访问过程中进行元素的增、删、改操作否则会抛出异常。
slice(start?: number, end?: number): Int8Arrayslice(start?: number, end?: number): Int8Array/
some(predicate: (value: number, index: number, array: Int8Array) => unknown, thisArg?: any): booleansome(predicate: TypedArrayPredicateFn<number, Int8Array>): booleanArkTS不支持this,因此不支持thisArg参数。
sort(compareFn?: (a: number, b: number) => number): thissort(compareFn?: TypedArrayCompareFn<number>): Int8Array1. 不允许在遍历、访问过程中进行元素的增、删、改操作,否则会抛出异常。 2. 继承场景下,无法获得实际类型的返回值。
subarray(begin?: number, end?: number): Int8Arraysubarray(begin?: number, end?: number): Int8Array不允许在遍历、访问过程中进行元素的增、删、改操作,否则会抛出异常。
[index: number]: number[index: number]: number不允许在遍历、访问过程中进行元素的增、删、改操作,否则会抛出异常。
entries(): IterableIterator<[number, number]>entries(): IterableIterator<[number, number]>/
keys(): IterableIterator<number>keys(): IterableIterator<number>/
values(): IterableIterator<number>values(): IterableIterator<number>/
includes(searchElement: number, fromIndex?: number): booleanincludes(searchElement: number, fromIndex?: number): boolean/
at(index: number): numberundefinedat(index: number): numberundefined
new(length: number): Int8Arrayconstructor(length: number)/
new(array: ArrayLike<number>ArrayBufferLike): Int8Arrayconstructor(array: ArrayLike<number>ArrayBuffer)
new(buffer: ArrayBufferLike, byteOffset?: number, length?: number): Int8Arrayconstructor(buffer: ArrayBuffer, byteOffset?: number, length?: number)/
from(arrayLike: ArrayLike<number>): Int8Arraystatic from(arrayLike: ArrayLike<number>): Int8Array/
from<T>(arrayLike: ArrayLike<T>, mapfn: (v: T, k: number) => number, thisArg?: any): Int8Arraystatic from<T>(arrayLike: ArrayLike<T>, mapFn: TypedArrayFromMapFn<T, number>): Int8ArrayArkTS不支持this,因此不支持thisArg参数。
from(arrayLike: Iterable<number>, mapfn?: (v: number, k: number) => number, thisArg?: any): Int8Arraystatic from(arrayLike: Iterable<number>, mapFn?: TypedArrayFromMapFn<number, number>): Int8ArrayArkTS不支持this,因此不支持thisArg参数。
of(...items: number[]): Int8Arraystatic of(...items: number[]): Int8Array/
toString(): stringtoString(): string不允许在遍历、访问过程中进行元素的增、删、改操作,否则会抛出异常。
toLocaleString(): stringtoLocaleString(): string不允许在遍历、访问过程中进行元素的增、删、改操作,否则会抛出异常。
lastIndexOf(searchElement: number, fromIndex?: number): numberlastIndexOf(searchElement: number, fromIndex?: number): number不允许在遍历、访问过程中进行元素的增、删、改操作,否则会抛出异常。
reduceRight(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Int8Array) => number): numberreduceRight(callbackFn: TypedArrayReduceCallback<number, number, Int8Array>): number不允许在遍历、访问过程中进行元素的增、删、改操作,否则会抛出异常。
reduceRight<U>(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Int8Array) => U, initialValue: U): UreduceRight<U = number>(callbackFn: TypedArrayReduceCallback<U, number, Int8Array>, initialValue: U): U不允许在遍历、访问过程中进行元素的增、删、改操作,否则会抛出异常。

Map

原生API方法ArkTS容器集方法是否有行为差异在ArkTS容器中的差异表现
readonly size: numberreadonly size: number不允许在遍历或访问过程中进行元素的增、删、改操作,否则会抛出异常。
clear(): voidclear(): void不允许在遍历或访问过程中进行元素的增、删、改操作,否则会抛出异常。
delete(key: K): booleandelete(key: K): boolean不允许在遍历或访问过程中进行元素的增、删、改操作,否则会抛出异常。
forEach(callbackfn: (value: V, key: K, map: Map<K, V>) => void, thisArg?: any): voidforEach(callbackFn: (value: V, key: K, map: Map<K, V>) => void): void1. 不允许在遍历、访问过程中进行元素的增、删、改操作,否则会抛出异常。 2. ArkTS不支持this,因此不支持thisArg参数。
get(key: K): Vundefinedget(key: K): Vundefined
has(key: K): booleanhas(key: K): boolean不允许在遍历、访问过程中进行元素的增、删、改操作,否则会抛出异常。
set(key: K, value: V): thisset(key: K, value: V): Map<K, V>不允许在遍历、访问过程中进行元素的增、删、改操作,否则会抛出异常。
entries(): IterableIterator<[K, V]>entries(): IterableIterator<[K, V]>/
keys(): IterableIterator<K>keys(): IterableIterator<K>/
values(): IterableIterator<V>values(): IterableIterator<V>/
new <K, V>(entries?: readonly (readonly [K, V])[]null): Map<K, V>constructor(entries?: readonly (readonly [K, V])[]null)

Set

原生API方法ArkTS容器集方法是否有行为差异在ArkTS容器中的差异表现
readonly size: numberreadonly size: numberSendable类和接口中不允许使用计算属性名称(arkts-sendable-computed-prop-name)。
add(value: T): thisadd(value: T): Set<T>不允许在遍历、访问过程中进行元素的增、删、改操作,否则会抛出异常。
clear(): voidclear(): void不允许在遍历、访问过程中进行元素的增、删、改操作,否则会抛出异常。
delete(value: T): booleandelete(value: T): boolean不允许在遍历、访问过程中进行元素的增、删、改操作,否则会抛出异常。
forEach(callbackfn: (value: T, value2: T, set: Set<T>) => void, thisArg?: any): voidforEach(callbackFn: (value: T, value2: T, set: Set<T>) => void): void1. 不允许在遍历、访问过程中进行元素的增、删、改操作,否则会抛出异常。 2. ArkTS不支持this,因此不支持thisArg参数。
has(value: T): booleanhas(value: T): boolean不允许在遍历、访问过程中进行元素的增、删、改操作,否则会抛出异常。
entries(): IterableIterator<[T, T]>entries(): IterableIterator<[T, T]>/
keys(): IterableIterator<T>keys(): IterableIterator<T>/
values(): IterableIterator<T>values(): IterableIterator<T>Sendable类和接口中不允许使用计算属性名称(arkts-sendable-computed-prop-name)。
new <T = any>(values?: readonly T[]null): Set<T>constructor(values?: readonly T[]null)