• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# SendableLruCache<K, V>
2<!--Kit: ArkTS-->
3<!--Subsystem: CommonLibrary-->
4<!--Owner: @lijiamin2025-->
5<!--Designer: @weng-changcheng-->
6<!--Tester: @kirl75; @zsw_zhushiwei-->
7<!--Adviser: @ge-yafang-->
8
9SendableLruCache在缓存空间不足时,会用新数据替换近期最少使用的数据。此设计基于资源访问的考虑:近期访问的数据可能在不久的将来再次访问,因此最少访问的数据价值最小,应优先移出缓存。SendableLruCache支持Sendable特性,可保存Sendable对象,确保跨线程安全访问。
10
11> **说明:**
12>
13> 本模块首批接口从API version 12开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。
14>
15> SendableLruCache首批接口从API version 18开始支持。
16>
17> 此模块仅支持在ArkTS文件(文件后缀为.ets)中导入使用。
18
19## 导入模块
20
21```ts
22import { ArkTSUtils } from '@kit.ArkTS'
23```
24
25## 属性
26
27**原子化服务API:** 从API version 18开始,该接口支持在原子化服务中使用。
28
29**系统能力:** SystemCapability.Utils.Lang
30
31| 名称   | 类型   | 只读 | 可选 | 说明                   |
32| ------ | ------ | ---- | ---- | ---------------------- |
33| length<sup>18+</sup> | number | 是   | 否   | 当前缓冲区中值的总数。 |
34
35**示例:**
36
37```ts
38let pro = new ArkTSUtils.SendableLruCache<number, number>();
39pro.put(2, 10);
40pro.put(1, 8);
41let result = pro.length;
42console.info('result = ' + result);
43// 期望输出:result = 2
44```
45
46## constructor<sup>18+</sup>
47
48constructor(capacity?: number)
49
50默认构造函数用于创建一个新的SendableLruCache实例,默认容量为64。
51
52**原子化服务API:** 从API version 18开始,该接口支持在原子化服务中使用。
53
54**系统能力:** SystemCapability.Utils.Lang
55
56**参数:**
57
58| 参数名   | 类型   | 必填 | 说明                         |
59| -------- | ------ | ---- | ---------------------------- |
60| capacity | number | 否   | 指示缓冲区的自定义容量。不传时,默认值为64,最大值不能超过2147483647;小于等于0时会抛出异常。 |
61
62**错误码:**
63
64以下错误码的详细介绍请参见[通用错误码](../errorcode-universal.md)。
65
66| 错误码ID  | 错误信息                                    |
67| -------- | ------------------------------------------|
68| 401      | Parameter error. Possible causes: 1.Mandatory parameters are left unspecified;2.Incorrect parameter types. |
69
70**示例:**
71
72```ts
73let pro = new ArkTSUtils.SendableLruCache<number, number>();
74```
75
76## updateCapacity<sup>18+</sup>
77
78updateCapacity(newCapacity: number): void
79
80将缓冲区容量设置为指定值。如果缓冲区中值的总数超过指定容量,将删除最少使用的键值对。
81
82**原子化服务API:** 从API version 18开始,该接口支持在原子化服务中使用。
83
84**系统能力:** SystemCapability.Utils.Lang
85
86**参数:**
87
88| 参数名      | 类型   | 必填 | 说明                         |
89| ----------- | ------ | ---- | ---------------------------- |
90| newCapacity | number | 是   | 指示要为缓冲区自定义的容量,最大值不能超过2147483647;小于等于0时会抛出异常。|
91
92**错误码:**
93
94以下错误码的详细介绍请参见[通用错误码](../errorcode-universal.md)。
95
96| 错误码ID  | 错误信息                                    |
97| -------- | ------------------------------------------|
98| 401      | Parameter error. Possible causes: 1.Mandatory parameters are left unspecified;2.Incorrect parameter types. |
99
100**示例:**
101
102```ts
103let pro = new ArkTSUtils.SendableLruCache<number, number>();
104pro.updateCapacity(100);
105```
106
107## toString<sup>18+</sup>
108
109toString(): string
110
111返回对象的字符串表示形式。
112
113**原子化服务API:** 从API version 18开始,该接口支持在原子化服务中使用。
114
115**系统能力:** SystemCapability.Utils.Lang
116
117**返回值:**
118
119| 类型   | 说明                       |
120| ------ | -------------------------- |
121| string | 返回对象的字符串表示形式。 返回字符串格式是:SendableLruCache[ maxSize = (maxSize), hits = (hitCount), misses = (missCount), hitRate = (hitRate) ]。 (maxSize)表示缓存区最大值,(hitCount)表示查询值匹配成功的次数,(missCount)表示查询值匹配失败的次数,(hitRate)表示查询值匹配率。|
122
123**示例:**
124
125```ts
126let pro = new ArkTSUtils.SendableLruCache<number, number>();
127pro.put(2, 10);
128pro.get(2);
129pro.get(3);
130console.info(pro.toString());
131// 预期输出:SendableLruCache[ maxSize = 64, hits = 1, misses = 1, hitRate = 50% ]
132// maxSize: 缓存区最大值 hits: 查询值匹配成功的次数 misses: 查询值匹配失败的次数 hitRate: 查询值匹配率
133```
134
135## getCapacity<sup>18+</sup>
136
137getCapacity(): number
138
139获取当前缓冲区的容量。
140
141**原子化服务API:** 从API version 18开始,该接口支持在原子化服务中使用。
142
143**系统能力:** SystemCapability.Utils.Lang
144
145**返回值:**
146
147| 类型   | 说明                   |
148| ------ | ---------------------- |
149| number | 返回当前缓冲区的容量。 |
150
151**示例:**
152
153```ts
154let pro = new ArkTSUtils.SendableLruCache<number, number>();
155let result = pro.getCapacity();
156console.info('result = ' + result);
157// 预期输出:result = 64
158```
159
160## clear<sup>18+</sup>
161
162clear(): void
163
164从当前缓冲区清除所有键值对。
165
166**原子化服务API:** 从API version 18开始,该接口支持在原子化服务中使用。
167
168**系统能力:** SystemCapability.Utils.Lang
169
170**示例:**
171
172```ts
173let pro = new ArkTSUtils.SendableLruCache<number, number>();
174pro.put(2, 10);
175let result = pro.length;
176pro.clear();
177let res = pro.length;
178console.info('result = ' + result);
179console.info('res = ' + res);
180// 预期输出:result = 1
181// 预期输出:res = 0
182```
183
184## getCreateCount<sup>18+</sup>
185
186getCreateCount(): number
187
188获取调用内部默认接口创建对象的次数。
189
190**原子化服务API:** 从API version 18开始,该接口支持在原子化服务中使用。
191
192**系统能力:** SystemCapability.Utils.Lang
193
194**返回值:**
195
196| 类型   | 说明                |
197| ------ | -------------------|
198| number | 返回使用内部默认接口创建对象的次数。 |
199
200**示例:**
201
202```ts
203@Sendable
204class ChildLRUCache extends ArkTSUtils.SendableLruCache<number, number> {
205  constructor() {
206    super();
207  }
208  createDefault(key: number): number {
209    return key;
210  }
211}
212
213let lru = new ChildLRUCache();
214lru.put(2, 10);
215lru.get(3);
216lru.get(5);
217let res = lru.getCreateCount();
218console.info('res = ' + res);
219// 预期输出:res = 2
220// 执行get操作时,如果键值不存在,调用createDefault接口判断返回值是否等于undefined
221// 如果不等于,则需要把key和返回值作为键值对添加到cache中,并且创建次数加1
222```
223
224## getMissCount<sup>18+</sup>
225
226getMissCount(): number
227
228获取查询值不匹配的次数。
229
230**原子化服务API:** 从API version 18开始,该接口支持在原子化服务中使用。
231
232**系统能力:** SystemCapability.Utils.Lang
233
234**返回值:**
235
236| 类型   | 说明                     |
237| ------ | ------------------------ |
238| number | 返回查询值不匹配的次数。 |
239
240**示例:**
241
242```ts
243let pro = new ArkTSUtils.SendableLruCache<number, number>();
244pro.put(2, 10);
245pro.get(2);
246let result = pro.getMissCount();
247console.info('result = ' + result);
248// 预期输出:result = 0
249```
250
251## getRemoveCount<sup>18+</sup>
252
253getRemoveCount(): number
254
255获取缓冲区键值对的回收次数。当缓冲区数量超过容量限制时,最少使用的键值对将被回收。
256
257**原子化服务API:** 从API version 18开始,该接口支持在原子化服务中使用。
258
259**系统能力:** SystemCapability.Utils.Lang
260
261**返回值:**
262
263| 类型   | 说明                       |
264| ------ | -------------------------- |
265| number | 返回缓冲区键值对回收的次数。 |
266
267**示例:**
268
269```ts
270let pro = new ArkTSUtils.SendableLruCache<number, number>();
271pro.put(2, 10);
272pro.updateCapacity(2);
273pro.put(50, 22);
274let result = pro.getRemoveCount();
275console.info('result = ' + result);
276// 预期输出:result = 0
277```
278
279## getMatchCount<sup>18+</sup>
280
281getMatchCount(): number
282
283获取查询值匹配成功的次数。
284
285**原子化服务API:** 从API version 18开始,该接口支持在原子化服务中使用。
286
287**系统能力:** SystemCapability.Utils.Lang
288
289**返回值:**
290
291| 类型   | 说明                       |
292| ------ | -------------------------- |
293| number | 返回查询值匹配成功的次数。 |
294
295**示例:**
296
297```ts
298let pro = new ArkTSUtils.SendableLruCache<number, number>();
299pro.put(2, 10);
300pro.get(2);
301let result = pro.getMatchCount();
302console.info('result = ' + result);
303// 预期输出:result = 1
304```
305
306## getPutCount<sup>18+</sup>
307
308getPutCount(): number
309
310获取将值添加到缓冲区的次数。
311
312**原子化服务API:** 从API version 18开始,该接口支持在原子化服务中使用。
313
314**系统能力:** SystemCapability.Utils.Lang
315
316**返回值:**
317
318| 类型   | 说明                         |
319| ------ | ---------------------------- |
320| number | 返回将值添加到缓冲区的次数。 |
321
322**示例:**
323
324```ts
325let pro = new ArkTSUtils.SendableLruCache<number, number>();
326pro.put(2, 10);
327let result = pro.getPutCount();
328console.info('result = ' + result);
329// 预期输出:result = 1
330```
331
332## isEmpty<sup>18+</sup>
333
334isEmpty(): boolean
335
336检查当前缓冲区是否为空。
337
338**原子化服务API:** 从API version 18开始,该接口支持在原子化服务中使用。
339
340**系统能力:** SystemCapability.Utils.Lang
341
342**返回值:**
343
344| 类型    | 说明                                     |
345| ------- | ---------------------------------------- |
346| boolean | 返回true表示当前缓冲区为空,不包含任何键值对;返回false表示当前缓冲区不为空。 |
347
348**示例:**
349
350```ts
351let pro = new ArkTSUtils.SendableLruCache<number, number>();
352pro.put(2, 10);
353let result = pro.isEmpty();
354console.info('result = ' + result);
355// 预期输出:result = false
356```
357
358## get<sup>18+</sup>
359
360get(key: K): V | undefined
361
362返回键对应的值。
363
364**原子化服务API:** 从API version 18开始,该接口支持在原子化服务中使用。
365
366**系统能力:** SystemCapability.Utils.Lang
367
368**参数:**
369
370| 参数名 | 类型 | 必填 | 说明         |
371| ------ | ---- | ---- | ------------ |
372| key    | K    | 是   | 要查询的键。 |
373
374**返回值:**
375
376| 类型                     | 说明                                                         |
377| ------------------------ | ------------------------------------------------------------ |
378| V \| undefined | 如果指定的键存在于缓冲区中,则返回与键关联的值;否则调用内部默认接口,生成一个键与值相同的对象,并返回其值。如果内部默认接口返回undefined,则最终返回undefined。 |
379
380**示例:**
381
382```ts
383let pro = new ArkTSUtils.SendableLruCache<number, number>();
384pro.put(2, 10);
385let result  = pro.get(2);
386console.info('result = ' + result);
387// 预期输出:result = 10
388```
389
390## put<sup>18+</sup>
391
392put(key: K,value: V): V
393
394将键值对添加到缓冲区,并返回与添加的键关联的值。当缓冲区中值的数量超过容量时,会执行删除操作。
395
396**原子化服务API:** 从API version 18开始,该接口支持在原子化服务中使用。
397
398**系统能力:** SystemCapability.Utils.Lang
399
400**参数:**
401
402| 参数名 | 类型 | 必填 | 说明                       |
403| ------ | ---- | ---- | -------------------------- |
404| key    | K    | 是   | 要添加的键。             |
405| value  | V    | 是   | 与要添加的键关联的值。 |
406
407**返回值:**
408
409| 类型 | 说明                                                         |
410| ---- | ------------------------------------------------------------ |
411| V    | 返回与添加的键关联的值。|
412
413**示例:**
414
415```ts
416let pro = new ArkTSUtils.SendableLruCache<number, number>();
417let result = pro.put(2, 10);
418console.info('result = ' + result);
419// 预期输出:result = 10
420```
421
422## values<sup>18+</sup>
423
424values(): V[]
425
426获取当前缓冲区中所有值的列表,按从最近访问到最少访问的顺序排列,最近访问的键值对表示有最新操作。
427
428**原子化服务API:** 从API version 18开始,该接口支持在原子化服务中使用。
429
430**系统能力:** SystemCapability.Utils.Lang
431
432**返回值:**
433
434| 类型      | 说明                                                         |
435| --------- | ------------------------------------------------------------ |
436| V&nbsp;[] | 返回当前缓冲区中所有值的列表,按从最近访问到最少访问的顺序排列。 |
437
438**示例:**
439
440```ts
441let pro = new ArkTSUtils.SendableLruCache<number|string,number|string>();
442pro.put(2, 10);
443pro.put(2, "anhu");
444pro.put("afaf", "grfb");
445let result = pro.values();
446console.info('result = ' + result);
447// 预期输出:result = anhu,grfb
448```
449
450## keys<sup>18+</sup>
451
452keys(): K[]
453
454获取当前缓冲区中所有键,按从最近访问到最少访问的顺序排列。
455
456**原子化服务API:** 从API version 18开始,该接口支持在原子化服务中使用。
457
458**系统能力:** SystemCapability.Utils.Lang
459
460**返回值:**
461
462| 类型      | 说明                                                         |
463| --------- | ------------------------------------------------------------ |
464| K&nbsp;[] | 返回当前缓冲区中所有键的列表,按从最近访问到最少访问的顺序排列。 |
465
466**示例:**
467
468```ts
469let pro = new ArkTSUtils.SendableLruCache<number, number>();
470pro.put(2, 10);
471pro.put(3, 1);
472let result = pro.keys();
473console.info('result = ' + result);
474// 预期输出:result = 2,3
475```
476
477## remove<sup>18+</sup>
478
479remove(key: K): V | undefined
480
481从当前缓冲区中删除指定键及其关联值,返回该键关联的值。若键不存在,则返回undefined。
482
483**原子化服务API:** 从API version 18开始,该接口支持在原子化服务中使用。
484
485**系统能力:** SystemCapability.Utils.Lang
486
487**参数:**
488
489| 参数名 | 类型 | 必填 | 说明           |
490| ------ | ---- | ---- | -------------- |
491| key    | K    | 是   | 要删除的键值。 |
492
493**返回值:**
494
495| 类型                     | 说明                                                         |
496| ------------------------ | ------------------------------------------------------------ |
497| V&nbsp;\|&nbsp;undefined | 返回一个包含已删除键值对的Optional对象;如果key不存在,则返回undefined,如果key为null,则抛出异常。 |
498
499**示例:**
500
501```ts
502let pro = new ArkTSUtils.SendableLruCache<number, number>();
503pro.put(2, 10);
504let result = pro.remove(20);
505console.info('result = ' + result);
506// 预期输出:result = undefined
507```
508
509## contains<sup>18+</sup>
510
511contains(key: K): boolean
512
513检查当前缓冲区是否包含指定的键,如果存在,返回true;否则,返回false。
514
515**原子化服务API:** 从API version 18开始,该接口支持在原子化服务中使用。
516
517**系统能力:** SystemCapability.Utils.Lang
518
519**参数:**
520
521| 参数名 | 类型   | 必填 | 说明             |
522| ------ | ------ | ---- | ---------------- |
523| key    | K      | 是   | 表示要检查的键。 |
524
525**返回值:**
526
527| 类型    | 说明                                       |
528| ------- | ------------------------------------------ |
529| boolean | 如果缓冲区包含指定的键,则返回true,否则返回false。 |
530
531**示例:**
532
533```ts
534let pro = new ArkTSUtils.SendableLruCache<number, number>();
535pro.put(2, 10);
536let result = pro.contains(2);
537console.info('result = ' + result);
538// 预期输出:result = true
539```
540
541## entries<sup>18+</sup>
542
543entries(): IterableIterator&lt;[K,V]&gt;
544
545允许迭代包含在这个对象中的所有键值对。
546
547**原子化服务API:** 从API version 18开始,该接口支持在原子化服务中使用。
548
549**系统能力:** SystemCapability.Utils.Lang
550
551**返回值:**
552
553| 类型        | 说明                 |
554| ----------- | -------------------- |
555| IterableIterator<[K,&nbsp;V]> | 返回一个可迭代数组。 |
556
557**示例:**
558
559```ts
560let pro = new ArkTSUtils.SendableLruCache<number, number>();
561pro.put(2, 10);
562pro.put(3, 15);
563let pair:Iterable<Object[]> = pro.entries();
564let arrayValue = Array.from(pair);
565for (let value of arrayValue) {
566  console.info(value[0]+ ', '+ value[1]);
567  // 预期输出:
568  // 2, 10
569  // 3, 15
570}
571```