1# 线性容器Deque 2 3>  **说明:** 4> 本模块首批接口从API version 8开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 5 6Deque(double ended queue)根据循环队列的数据结构实现,符合先进先出以及先进后出的特点,支持两端的元素插入和移除。Deque会根据实际需要动态调整容量,每次进行两倍扩容。 7 8Deque和[Queue](js-apis-queue.md)相比,Queue的特点是先进先出,只能在头部删除元素,尾部增加元素。 9 10与[Vector](js-apis-vector.md)相比,它们都支持在两端增删元素,但Deque不能进行中间插入的操作。对头部元素的插入删除效率高于Vector,而Vector访问元素的效率高于Deque。 11 12**推荐使用场景:** 需要频繁在集合两端进行增删元素的操作时,推荐使用Deque。 13 14## 导入模块 15 16```ts 17import Deque from '@ohos.util.Deque'; 18``` 19 20## Deque 21 22### 属性 23 24**系统能力:** SystemCapability.Utils.Lang 25 26| 名称 | 参数类型 | 可读 | 可写 | 说明 | 27| -------- | -------- | -------- | -------- | -------- | 28| length | number | 是 | 否 | Deque的元素个数。 | 29 30### constructor 31 32constructor() 33 34Deque的构造函数。 35 36**系统能力:** SystemCapability.Utils.Lang 37 38**示例:** 39 40```ts 41let deque = new Deque(); 42``` 43 44### insertFront 45 46insertFront(element: T): void 47 48在deque头部插入元素。 49 50**系统能力:** SystemCapability.Utils.Lang 51 52**参数:** 53 54| 参数名 | 类型 | 必填 | 说明 | 55| -------- | -------- | -------- | -------- | 56| element | T | 是 | 插入的元素。 | 57 58**示例:** 59 60```ts 61let deque = new Deque(); 62deque.insertFront("a"); 63deque.insertFront(1); 64let b = [1, 2, 3]; 65deque.insertFront(b); 66let c = {name : "lala", age : "13"}; 67deque.insertFront(false); 68``` 69 70### insertEnd 71 72insertEnd(element: T): void 73 74在deque尾部插入元素。 75 76**系统能力:** SystemCapability.Utils.Lang 77 78**参数:** 79 80| 参数名 | 类型 | 必填 | 说明 | 81| -------- | -------- | -------- | -------- | 82| element | T | 是 | 插入的元素。 | 83 84**示例:** 85 86```ts 87let deque = new Deque(); 88deque.insertEnd("a"); 89deque.insertEnd(1); 90let b = [1, 2, 3]; 91deque.insertEnd(b); 92let c = {name : "lala", age : "13"}; 93deque.insertEnd(false); 94``` 95 96### has 97 98has(element: T): boolean 99 100判断此Deque中是否含有该指定元素。 101 102**系统能力:** SystemCapability.Utils.Lang 103 104**参数:** 105 106| 参数名 | 类型 | 必填 | 说明 | 107| -------- | -------- | -------- | -------- | 108| element | T | 是 | 指定的元素。 | 109 110**返回值:** 111 112| 类型 | 说明 | 113| -------- | -------- | 114| boolean | 如果包含指定元素返回true,否则返回false。 | 115 116**示例:** 117 118```ts 119let deque = new Deque(); 120let result = deque.has("Ahfbrgrbgnutfodgorrogorg"); 121deque.insertFront("Ahfbrgrbgnutfodgorrogorg"); 122let result1 = deque.has("Ahfbrgrbgnutfodgorrogorg"); 123``` 124 125### popFirst 126 127popFirst(): T 128 129删除并返回双端队列的首元素。 130 131**系统能力:** SystemCapability.Utils.Lang 132 133**返回值:** 134 135| 类型 | 说明 | 136| -------- | -------- | 137| T | 返回被删除的元素。 | 138 139**示例:** 140 141```ts 142let deque = new Deque(); 143deque.insertFront(2); 144deque.insertFront(4); 145deque.insertEnd(5); 146deque.insertFront(2); 147deque.insertFront(4); 148let result = deque.popFirst(); 149``` 150 151### popLast 152 153popLast(): T 154 155删除并返回双端队列的尾元素。 156 157**系统能力:** SystemCapability.Utils.Lang 158 159**返回值:** 160 161| 类型 | 说明 | 162| -------- | -------- | 163| T | 返回被删除的元素。 | 164 165**示例:** 166 167```ts 168let deque = new Deque(); 169deque.insertFront(2); 170deque.insertEnd(4); 171deque.insertFront(5); 172deque.insertFront(2); 173deque.insertFront(4); 174let result = deque.popLast(); 175``` 176 177### forEach 178 179forEach(callbackfn: (value: T, index?: number, deque?: Deque<T>) => void, 180thisArg?: Object): void 181 182通过回调函数来遍历Deque实例对象上的元素以及元素对应的下标。 183 184**系统能力:** SystemCapability.Utils.Lang 185 186**参数:** 187 188| 参数名 | 类型 | 必填 | 说明 | 189| -------- | -------- | -------- | -------- | 190| callbackfn | function | 是 | 回调函数。 | 191| thisArg | Object | 否 | callbackfn被调用时用作this值。 | 192 193callbackfn的参数说明: 194 195| 参数名 | 类型 | 必填 | 说明 | 196| -------- | -------- | -------- | -------- | 197| value | T | 是 | 当前遍历到的元素。 | 198| index | number | 否 | 当前遍历到的下标值。 | 199| deque | Deque<T> | 否 | 当前调用forEach方法的实例对象。 | 200 201**示例:** 202 203```ts 204let deque = new Deque(); 205deque.insertFront(2); 206deque.insertEnd(4); 207deque.insertFront(5); 208deque.insertEnd(4); 209deque.forEach((value, index) => { 210 console.log("value:" + value, "index:" + index); 211}); 212``` 213 214### getFirst 215 216getFirst(): T 217 218获取Deque实例中的头元素。 219 220**系统能力:** SystemCapability.Utils.Lang 221 222**返回值:** 223 224| 类型 | 说明 | 225| -------- | -------- | 226| T | 返回T型 | 227 228**示例:** 229 230```ts 231let deque = new Deque(); 232deque.insertEnd(2); 233deque.insertEnd(4); 234deque.insertFront(5); 235deque.insertFront(4); 236let result = deque.getFirst(); 237``` 238 239### getLast 240 241getLast(): T 242 243获取Deque实例中的尾元素。 244 245**系统能力:** SystemCapability.Utils.Lang 246 247**返回值:** 248 249| 类型 | 说明 | 250| -------- | -------- | 251| T | 返回T型 | 252 253**示例:** 254 255```ts 256let deque = new Deque(); 257deque.insertFront(2); 258deque.insertFront(4); 259deque.insertFront(5); 260deque.insertFront(4); 261let result = deque.getLast(); 262``` 263 264### [Symbol.iterator] 265 266[Symbol.iterator]\(): IterableIterator<T> 267 268返回一个迭代器,迭代器的每一项都是一个 JavaScript 对象,并返回该对象。 269 270**系统能力:** SystemCapability.Utils.Lang 271 272**返回值:** 273 274| 类型 | 说明 | 275| -------- | -------- | 276| IterableIterator<T> | 返回一个迭代器。 | 277 278**示例:** 279```ts 280let deque = new Deque(); 281deque.insertFront(2); 282deque.insertFront(4); 283deque.insertFront(5); 284deque.insertFront(4); 285 286// 使用方法一: 287for (let item of deque) { 288 console.log("value:" + item); 289} 290 291// 使用方法二: 292let iter = deque[Symbol.iterator](); 293let temp = iter.next().value; 294while(temp != undefined) { 295 console.log("value:" + temp); 296 temp = iter.next().value; 297} 298```