阅读(2069) (0)

鸿蒙OS LruBuffer

2022-08-16 15:15:00 更新

LruBuffer

java.lang.Object

|---ohos.utils.LruBuffer<K,V&

public class LruBuffer<K,V>
extends Object

一种缓存类,当容量不足以存储新值时,使用最近最少使用 (LRU) 算法删除最近最少访问的值。

您可以指定缓冲区的容量。当缓冲区中的键值对数量超过其预设容量时,LRU算法生效。具体来说,最近最少访问的键值对将被删除,以便为新的键值对腾出空间。您还可以重置缓冲区容量。如果新设置的缓冲区容量小于已存储的键值对的数量,则触发LRU算法删除最近最少访问的键值对。以下方法具有访问令牌:put(java.lang.Object,java.lang.Object), get(java.lang.Object), contains(java.lang.Object)。如果其中一个已被成功调用并且已经对一个值执行了实际操作,该值将被标记为最近访问的值,因此它在缓冲区满时的自动清除将被推迟。

该类的大部分方法都支持同步机制,因此可以在多线程或并发场景中使用。该类还提供了getMatchCount()、getMissCount()和getPutCount()方法,用于获取存储的key-value对的访问统计信息,包括匹配的查询key-value对的总数、不匹配的查询key-value对的总数、并添加了键值对。

另外,您可以重写该类中的afterRemoval(boolean,java.lang.Object,java.lang.Object,java.lang.Object)方法,在存储的键值对被删除或自动清除后进行后续操作。注意:缓冲区容量不能设置为0,key或value不能为null。

构造函数摘要

构造函数 描述
LruBuffer() 默认构造函数用于创建一个新的 LruBuffer 实例,默认容量为 64。
LruBuffer(int capacity) 用于创建新 LruBuffer 实例的构造函数。

方法总结

修饰符和类型 方法 描述
protected void afterRemoval(boolean isEvict, K key, V value, V newValue) 删除值后执行后续操作。
int capacity() 获取当前缓冲区的容量。
void clear() 从当前缓冲区中清除键值对。
boolean contains(K key) 检查当前缓冲区是否包含指定的键。
protected V createDefault(K key) 如果未命中,则执行后续操作以计算特定键的值。
V get(K key) 获取与指定键关联的值。
int getCreateCount() 获取 createDefault(java.lang.Object) 返回值的次数。
int getMatchCount() 获取查询值匹配成功的次数。
int getMissCount() 获取查询值不匹配的次数。
int getPutCount() 获取将值添加到缓冲区的次数。
int getRemovalCount() 获取从缓冲区中逐出值的次数。
boolean isEmpty() 检查当前缓冲区是否为空。
ListK keys() 获取当前缓冲区中值的键列表。
V put(K key, V value) 将键值对添加到缓冲区。
OptionalV remove(K key) 从当前缓冲区中删除指定的键及其关联的值。
int size() 获取当前缓冲区中值的总数。
String toString() 返回对象的字符串表示形式。
void updateCapacity(int newCapacity) 将缓冲区容量更新为指定容量。
ListV values() 获取当前缓冲区中所有值的列表。
从类 java.lang.Object 继承的方法
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait

构造函数详细信息

LruBuffer

public LruBuffer()

默认构造函数用于创建一个新的 LruBuffer 实例,默认容量为 64。

LruBuffer

public LruBuffer(int capacity)

用于创建新 LruBuffer 实例的构造函数。

参数:

参数名称 参数描述
capacity 指示为缓冲区自定义的容量。

Throws:

Throw名称 Throw描述
IllegalArgumentException 如果容量小于或等于 0,则引发此异常。

方法详情

afterRemoval

protected void afterRemoval(boolean isEvict, K key, V value, V newValue)

删除值后执行后续操作。

当使用 remove(java.lang.Object)、clear()、put(java.lang.Object,java.lang.Object) 或 updateCapacity(int) 方法时,会自动调用此方法。 您可以根据存储值的特性来决定是否覆盖该方法。

参数:

参数名称 参数描述
isEvict 因容量不足而调用该方法时参数值为真,其他情况下参数值为假。
key 表示已删除的密钥。
value 表示删除的值。
newValue 如果调用了 put(java.lang.Object,java.lang.Object) 方法并且要添加的键已经存在,则参数值是关联的新值。 其他情况下参数值为空。

createDefault

protected V createDefault(K key)

如果未命中,则执行后续操作以计算特定键的值。

如果在 get(java.lang.Object) 错过计算键的值之后,会自动调用此方法。 您可以根据存储值的特性来决定是否覆盖该方法。

参数:

参数名称 参数描述
key 表示遗漏的键。

返回:

返回与键关联的值。

capacity

public final int capacity()

获取当前缓冲区的容量。

返回:

返回当前缓冲区的容量。

clear

public final void clear()

从当前缓冲区中清除键值对。 当键值对被清除后,调用 afterRemoval(boolean,java.lang.Object,java.lang.Object,java.lang.Object) 方法依次对其执行后续操作。

getMatchCount

public final int getMatchCount()

获取查询值匹配成功的次数。

返回:

返回查询值匹配成功的次数。

getMissCount

public final int getMissCount()

获取查询值不匹配的次数。

返回:

返回查询值不匹配的次数。

getPutCount

public final int getPutCount()

获取将值添加到缓冲区的次数。

返回:

返回将值添加到缓冲区的次数。

contains

public final boolean contains(K key)

检查当前缓冲区是否包含指定的键。

参数:

参数名称 参数描述
key 表示要检查的键。

返回:

如果缓冲区包含指定的键,则返回 true。

get

public final V get(K key)

获取与指定键关联的值。

参数:

参数名称 参数描述
key 表示要查询的键。

返回:

如果指定的键存在于缓冲区中,则返回与键关联的值; 否则返回 null。

getCreateCount

public final int getCreateCount()

获取 createDefault(java.lang.Object) 返回值的次数。

返回:

返回 createDefault(java.lang.Object) 返回值的次数。

isEmpty

public final boolean isEmpty()

检查当前缓冲区是否为空。

返回:

如果当前缓冲区不包含任何值,则返回 true。

keys

public final ListK keys()

获取当前缓冲区中值的键列表。

返回:

返回从最近访问到最近访问最少的键列表。

put

public final V put(K key, V value)

将键值对添加到缓冲区。

如果当前缓冲区已满,最近最少访问的键值对将被自动清除,为添加新的键值对腾出空间。 如果要添加的键已经存在于缓冲区中,则其关联的值将替换为要添加的值。

参数:

参数名称 参数描述
key 表示要添加的键。
value 指示与要添加的键关联的值。

返回:

返回与添加的键关联的值; 如果要添加的键已经存在,则返回原始值。

Throws:

Throw名称 Throw描述
NullPointerException 如果 key 或 value 为 null,则引发此异常。

getRemovalCount

public final int getRemovalCount()

获取从缓冲区中逐出值的次数。

返回:

返回从缓冲区中逐出值的次数。

remove

public final OptionalV remove(K key)

从当前缓冲区中删除指定的键及其关联的值。

关联值删除后,会自动调用 afterRemoval(boolean,java.lang.Object,java.lang.Object,java.lang.Object) 方法对删除的值进行后续操作。

参数:

参数名称 参数描述
key 表示要删除的键。

返回:

返回一个包含已删除键值对的 Optional 对象; 如果键不存在,则返回一个空的 Optional 对象。

Throws:

Throw名称 Throw描述
NullPointerException 如果 key 为 null,则引发此异常。

size

public final int size()

获取当前缓冲区中值的总数。

返回:

返回当前缓冲区中值的总数。

toString

public String toString()

从类复制的描述:对象

返回对象的字符串表示形式。 通常,toString 方法返回一个“以文本方式表示”该对象的字符串。 结果应该是一个简洁但信息丰富的表示,易于人们阅读。 建议所有子类重写此方法。

Object 类的 toString 方法返回一个字符串,该字符串由对象作为其实例的类的名称、at 符号字符“@”和对象哈希码的无符号十六进制表示形式组成。 换句话说,此方法返回一个等于以下值的字符串:

 getClass().getName() + '@' + Integer.toHexString(hashCode()) 

覆盖:

类 Object 中的 toString

返回:

对象的字符串表示形式。

updateCapacity

public final void updateCapacity(int newCapacity)

将缓冲区容量更新为指定容量。

如果指定的容量小于缓冲区中存储的值的总数,则根据最近最少访问到最近访问的访问频率清除值,直到数量等于指定容量。

参数:

参数名称 参数描述
newCapacity 表示要设置的新容量。

Throws:

Throw名称 Throw描述
IllegalArgumentException 如果 newCapacity 小于或等于 0,则抛出此异常。

values

public final ListV values()

获取当前缓冲区中所有值的列表。

返回:

按升序返回当前缓冲区中所有值的列表,从最近访问到最近访问最少。