linear-container.md 14.6 KB
Newer Older
G
ge-yafang 已提交
1 2 3 4 5 6 7 8 9 10 11
# 线性容器


线性容器实现能按顺序访问的数据结构,其底层主要通过数组实现,包括ArrayList、Vector、List、LinkedList、Deque、Queue、Stack七种。


线性容器,充分考虑了数据访问的速度,运行时(Runtime)通过一条字节码指令就可以完成增、删、改、查等操作。


## ArrayList

G
ge-yafang 已提交
12
[ArrayList](../reference/apis/js-apis-arraylist.md)即动态数组,可用来构造全局的数组对象。 当需要频繁读取集合中的元素时,推荐使用ArrayList。
G
ge-yafang 已提交
13 14 15

ArrayList依据泛型定义,要求存储位置是一片连续的内存空间,初始容量大小为10,并支持动态扩容,每次扩容大小为原始容量的1.5倍。

16
ArrayList进行增、删、改、查操作的常用API如下:
G
ge-yafang 已提交
17 18

| 操作 | 描述 |
G
ge-yafang 已提交
19
| --------- | ------- |
G
ge-yafang 已提交
20 21 22
| 增加元素 | 通过add(element: T)函数每次在数组尾部增加一个元素。 |
| 增加元素 | 通过insert(element: T, index: number)在指定位置插入一个元素。 |
| 访问元素 | 通过arr\[index]获取指定index对应的value值,通过指令获取保证访问速度。 |
23
| 访问元素 | 通过forEach(callbackFn: (value: T, index?: number, arrlist?: ArrayList<T>) => void, thisArg?: Object): void访问整个ArrayList容器的元素。 |
W
wusongqing 已提交
24
| 访问元素 | 通过\[Symbol.iterator]():IterableIterator<T>迭代器进行数据访问。 |
G
ge-yafang 已提交
25 26 27 28 29 30 31 32 33 34 35 36 37
| 修改元素 | 通过arr\[index] = xxx修改指定index位置对应的value值。 |
| 删除元素 | 通过remove(element: T)删除第一个匹配到的元素。 |
| 删除元素 | 通过removeByRange(fromIndex: number, toIndex:number)删除指定范围内的元素。 |


## Vector

[Vector](../reference/apis/js-apis-vector.md)是指连续存储结构,可用来构造全局的数组对象。Vector依据泛型定义,要求存储位置是一片连续的内存空间,初始容量大小为10,并支持动态扩容,每次扩容大小为原始容量的2倍。

Vector和[ArrayList](../reference/apis/js-apis-arraylist.md)相似,都是基于数组实现,但Vector提供了更多操作数组的接口。Vector在支持操作符访问的基础上,还增加了get/set接口,提供更为完善的校验及容错机制,满足用户不同场景下的需求。

API version 9开始,该接口不再维护,推荐使用[ArrayList](../reference/apis/js-apis-arraylist.md)

38
Vector进行增、删、改、查操作的常用API如下:
G
ge-yafang 已提交
39 40

| 操作 | 描述 |
G
ge-yafang 已提交
41
| --------- | ------- |
G
ge-yafang 已提交
42 43 44 45 46 47 48
| 增加元素 | 通过add(element: T)函数每次在数组尾部增加一个元素。 |
| 增加元素 | 通过insert(element: T, index: number)在指定位置插入一个元素。 |
| 访问元素 | 通过vec\[index]获取指定index对应的value值,通过指令获取保证访问速度。 |
| 访问元素 | 通过get(index: number)获取指定index位置对应的元素。 |
| 访问元素 | 通过getLastElement()获取最后一个元素。 |
| 访问元素 | 通过getlndexOf(element:T)获取第一个匹配到元素的位置。 |
| 访问元素 | 通过getLastlndexOf(element:T)获取最后一个匹配到元素的位置。 |
49
| 访问元素 | 通过forEach(callbackFn: (value: T, index?: number, Vector?: Vector<T>) => void, thisArg?: Object)访问整个Vector的元素。 |
W
wusongqing 已提交
50
| 访问元素 | 通过\[Symbol.iterator]():IterableIterator<T>迭代器进行数据访问。 |
G
ge-yafang 已提交
51 52 53 54 55
| 修改元素 | 通过vec\[index]=xxx修改指定index位置对应的value值。 |
| 修改元素 | 通过set(index:number,element:T)修改指定index位置的元素值为element。 |
| 修改元素 | 通过setLength(newSize:number)设置Vector的长度大小。 |
| 删除元素 | 通过removeBylndex(index:number)删除index位置对应的value值。 |
| 删除元素 | 通过remove(element:T)删除第一个匹配到的元素。 |
W
wusongqing 已提交
56
| 删除元素 | 通过removeByRange(fromIndex:number,toIndex:number)删除指定范围内的元素。 |
G
ge-yafang 已提交
57 58 59 60 61 62 63 64 65 66


## List

[List](../reference/apis/js-apis-list.md)可用来构造一个单向链表对象,即只能通过头结点开始访问到尾节点。List依据泛型定义,在内存中的存储位置可以是不连续的。

List和[LinkedList](../reference/apis/js-apis-linkedlist.md)相比,LinkedList是双向链表,可以快速地在头尾进行增删,而List是单向链表,无法双向操作。

当需要频繁的插入删除时,推荐使用List高效操作。

67
可以通过get/set等接口对存储的元素进行修改,List进行增、删、改、查操作的常用API如下:
G
ge-yafang 已提交
68 69

| 操作 | 描述 |
G
ge-yafang 已提交
70
| --------- | ------ |
G
ge-yafang 已提交
71 72 73 74 75 76 77 78 79
| 增加元素 | 通过add(element: T)函数每次在数组尾部增加一个元素。 |
| 增加元素 | 通过insert(element: T, index: number)在指定位置插入一个元素。 |
| 访问元素 | 通过list\[index]获取指定index对应的value值,通过指令获取保证访问速度。 |
| 访问元素 | 通过get(index: number)获取指定index位置对应的元素。 |
| 访问元素 | 通过getFirst()获取第一个元素。 |
| 访问元素 | 通过getLast()获取最后一个元素。 |
| 访问元素 | 通过getlndexOf(element: T)获取第一个匹配到元素的位置。 |
| 访问元素 | 通过getLastlndexOf(element: T)获取最后一个匹配到元素的位置。 |
| 访问元素 | 通过forEach(callbackfn: (value:T, index?: number, list?: List<T>)=> void,thisArg?: Object)访问整个List的元素。 |
80
| 访问元素 | 通过\[Symbol.iterator]():IterableIterator<T>迭代器进行数据访问。 |
G
ge-yafang 已提交
81 82
| 修改元素 | 通过list\[index] = xxx修改指定index位置对应的value值。 |
| 修改元素 | 通过set(index:number, element: T)修改指定index位置的元素值为element。 |
83
| 修改元素 | 通过replaceAllElements(callbackFn:(value: T,index?: number,list?: List<T>)=>T,thisArg?: Object)对List内元素进行替换操作。 |
G
ge-yafang 已提交
84 85 86 87 88 89 90 91 92 93 94 95 96 97
| 删除元素 | 通过removeBylndex(index:number)删除index位置对应的value值。 |
| 删除元素 | 通过remove(element:T)删除第一个匹配到的元素。 |


## LinkedList

[LinkedList](../reference/apis/js-apis-linkedlist.md)可用来构造一个双向链表对象,可以在某一节点向前或者向后遍历List。LinkedList依据泛型定义,在内存中的存储位置可以是不连续的。

LinkedList和[List](../reference/apis/js-apis-list.md)相比,LinkedList是双向链表,可以快速地在头尾进行增删,而List是单向链表,无法双向操作。

LinkedList和[ArrayList](../reference/apis/js-apis-arraylist.md)相比,插入数据效率LinkedList优于ArrayList,而查询效率ArrayList优于LinkedList。

当需要频繁的插入删除时,推荐使用LinkedList高效操作。

98
可以通过get/set等接口对存储的元素进行修改,LinkedList进行增、删、改、查操作的常用API如下:
G
ge-yafang 已提交
99 100

| 操作 | 描述 |
G
ge-yafang 已提交
101
| ---------- | ------ |
G
ge-yafang 已提交
102
| 增加元素 | 通过add(element: T)函数每次在数组尾部增加一个元素。 |
103
| 增加元素 | 通过insert(index: number, element: T)在指定位置插入一个元素。 |
G
ge-yafang 已提交
104 105 106 107 108
| 访问元素 | 通过list\[index]获取指定index对应的value值,通过指令获取保证访问速度。 |
| 访问元素 | 通过get(index: number)获取指定index位置对应的元素。 |
| 访问元素 | 通过getFirst()获取第一个元素。 |
| 访问元素 | 通过getLast()获取最后一个元素。 |
| 访问元素 | 通过getlndexOf(element: T)获取第一个匹配到元素的位置。 |
109 110
| 访问元素 | 通过getLastlndexOf(element: T)获取最后一个匹配到元素的位置。 |
| 访问元素 | 通过forEach(callbackFn: (value: T, index?: number, list?: LinkedList<T>) => void, thisArg?: Object)访问整个LinkedList的元素。 |
111
| 访问元素 | 通过\[Symbol.iterator]():IterableIterator<T>迭代器进行数据访问。 |
G
ge-yafang 已提交
112 113 114 115 116 117 118 119
| 修改元素 | 通过list\[index]=xxx修改指定index位置对应的value值。 |
| 修改元素 | 通过set(index: number,element: T)修改指定index位置的元素值为element。 |
| 删除元素 | 通过removeBylndex(index: number)删除index位置对应的value值。 |
| 删除元素 | 通过remove(element: T)删除第一个匹配到的元素。 |


## Deque

120
[Deque](../reference/apis/js-apis-deque.md)可用来构造双端队列对象,存储元素遵循先进先出以及先进后出的规则,双端队列可以分别从队头或者队尾进行访问。
G
ge-yafang 已提交
121 122 123

Deque依据泛型定义,要求存储位置是一片连续的内存空间,其初始容量大小为8,并支持动态扩容,每次扩容大小为原始容量的2倍。Deque底层采用循环队列实现,入队及出队操作效率都比较高。

G
ge-yafang 已提交
124
Deque和[Queue](../reference/apis/js-apis-queue.md)相比,Queue的特点是先进先出,只能在头部删除元素,尾部增加元素。
G
ge-yafang 已提交
125 126 127 128 129

Deque和[Vector](../reference/apis/js-apis-vector.md)相比,它们都支持在两端增删元素,但Deque不能进行中间插入的操作。对头部元素的插入删除效率高于Vector,而Vector访问元素的效率高于Deque。

需要频繁在集合两端进行增删元素的操作时,推荐使用Deque。

130
Deque进行增、删、改、查操作的常用API如下:
G
ge-yafang 已提交
131 132

| 操作 | 描述 |
G
ge-yafang 已提交
133
| ---------- | ------ |
G
ge-yafang 已提交
134 135 136 137 138 139
| 增加元素 | 通过insertFront(element: T)函数每次在队头增加一个元素。 |
| 增加元素 | 通过insertEnd(element: T)函数每次在队尾增加一个元素。 |
| 访问元素 | 通过getFirst()获取队首元素的value值,但是不进行出队操作。 |
| 访问元素 | 通过getLast()获取队尾元素的value值,但是不进行出队操作。 |
| 访问元素 | 通过popFirst()获取队首元素的value值,并进行出队操作。 |
| 访问元素 | 通过popLast()获取队尾元素的value值,并进行出队操作。 |
140
| 访问元素 | 通过forEach(callbackFn:(value: T, index?: number, deque?: Deque<T>) => void, thisArg?: Object)访问整个Deque的元素。 |
W
wusongqing 已提交
141
| 访问元素 | 通过\[Symbol.iterator]():IterableIterator<T>迭代器进行数据访问。 |
142
| 修改元素 | 通过forEach(callbackFn:(value: T, index?: number, deque?: Deque<T>)=> void, thisArg?: Object)对队列进行修改操作。 |
G
ge-yafang 已提交
143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158
| 删除元素 | 通过popFirst()对队首元素进行出队操作并删除。 |
| 删除元素 | 通过popLast()对队尾元素进行出队操作并删除。 |


## Queue

[Queue](../reference/apis/js-apis-queue.md)可用来构造队列对象,存储元素遵循先进先出的规则。

Queue依据泛型定义,要求存储位置是一片连续的内存空间,初始容量大小为8,并支持动态扩容,每次扩容大小为原始容量的2倍。

Queue底层采用循环队列实现,入队及出队操作效率都比较高。

Queue和[Deque](../reference/apis/js-apis-deque.md)相比,Queue只能在一端删除一端增加,Deque可以两端增删。

一般符合先进先出的场景可以使用Queue。

159
Queue进行增、删、改、查操作的常用API如下:
G
ge-yafang 已提交
160 161

| 操作 | 描述 |
G
ge-yafang 已提交
162
| ---------- | ------ |
G
ge-yafang 已提交
163 164 165
| 增加元素 | 通过add(element: T)函数每次在队尾增加一个元素。 |
| 访问元素 | 通过getFirst()获取队首元素的value值,但是不进行出队操作。 |
| 访问元素 | 通过pop()获取队首元素的value值,并进行出队操作。 |
166
| 访问元素 | 通过forEach(callbackFn: (value: T, index?: number, queue?: Queue<T>) => void,thisArg?: Object)访问整个Queue的元素。 |
W
wusongqing 已提交
167
| 访问元素 | 通过\[Symbol.iterator]():IterableIterator<T>迭代器进行数据访问。 |
168
| 修改元素 | 通过forEach(callbackFn:(value: T, index?: number, queue?: Queue<T>) => void,thisArg?: Object)对队列进行修改操作。 |
G
ge-yafang 已提交
169 170 171 172 173
| 删除元素 | 通过pop()对队首进行出队操作并删除。 |


## Stack

W
wusongqing 已提交
174
[Stack](../reference/apis/js-apis-stack.md)可用来构造栈对象,存储元素遵循先进后出的规则。
G
ge-yafang 已提交
175 176 177 178 179 180 181

Stack依据泛型定义,要求存储位置是一片连续的内存空间,初始容量大小为8,并支持动态扩容,每次扩容大小为原始容量的1.5倍。Stack底层基于数组实现,入栈出栈均从数组的一端操作。

Stack和[Queue](../reference/apis/js-apis-queue.md)相比,Queue基于循环队列实现,只能在一端删除,另一端插入,而Stack都在一端操作。

一般符合先进后出的场景可以使用Stack。

182
Stack进行增、删、改、查操作的常用API如下:
G
ge-yafang 已提交
183 184

| 操作 | 描述 |
G
ge-yafang 已提交
185
| ---------- | ------ |
W
wusongqing 已提交
186
| 增加元素 | 通过push(item: T)函数每次在栈顶增加一个元素。 |
G
ge-yafang 已提交
187 188
| 访问元素 | 通过peek()获取栈顶元素的value值,但是不进行出栈操作。 |
| 访问元素 | 通过pop()获取栈顶的value值,并进行出栈操作。 |
189
| 访问元素 | 通过forEach(callbackFn: (value: T, index?: number, stack?: Stack<T>) => void, thisArg?: Object)访问整个Stack的元素。 |
W
wusongqing 已提交
190
| 访问元素 | 通过\[Symbol.iterator]():IterableIterator<T>迭代器进行数据访问。 |
G
ge-yafang 已提交
191
| 访问元素 | 通过locate(element: T)获取元素对应的位置。 |
192
| 修改元素 | 通过forEach(callbackFn:(value: T, index?: number, stack?: Stack<T>) => void, thisArg?: Object)对栈内元素进行修改操作。 |
G
ge-yafang 已提交
193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253
| 删除元素 | 通过pop()对栈顶进行出栈操作并删除。 |


## 线性容器的使用

此处列举常用的线性容器ArrayList、Vector、Deque、Stack、List的使用示例,包括导入模块、增加元素、访问元素及修改等操作。示例代码如下所示:


```js
// ArrayList
import ArrayList from '@ohos.util.ArrayList'; // 导入ArrayList模块

let arrayList = new ArrayList();
arrayList.add('a');
arrayList.add(1); // 增加元素
console.info(`result: ${arrayList[0]}`); // 访问元素
arrayList[0] = 'one'; // 修改元素
console.info(`result: ${arrayList[0]}`);

// Vector
import Vector from '@ohos.util.Vector'; // 导入Vector模块

let vector = new Vector();
vector.add('a');
let b1 = [1, 2, 3];
vector.add(b1);
vector.add(false); // 增加元素
console.info(`result: ${vector[0]}`); // 访问元素
console.info(`result: ${vector.getFirstElement()}`); // 访问元素

// Deque
import Deque from '@ohos.util.Deque'; // 导入Deque模块

let deque = new Deque;
deque.insertFront('a');
deque.insertFront(1); // 增加元素
console.info(`result: ${deque[0]}`); // 访问元素
deque[0] = 'one'; // 修改元素
console.info(`result: ${deque[0]}`);

// Stack
import Stack from '@ohos.util.Stack'; // 导入Stack模块 

let stack = new Stack();
stack.push('a');
stack.push(1); // 增加元素
console.info(`result: ${stack[0]}`); // 访问元素
stack.pop(); // 弹出元素
console.info(`result: ${stack.length}`);

// List
import List from '@ohos.util.List'; // 导入List模块

let list = new List;
list.add('a');
list.add(1);
let b2 = [1, 2, 3];
list.add(b2); // 增加元素
console.info(`result: ${list[0]}`); // 访问元素
console.info(`result: ${list.get(0)}`); // 访问元素
```