LruCache 使用及原理,2024年最新flutter项目

LruCache是一种常用的缓存机制,它是Least Recently Used(最近最少使用)的缩写。它是一种自动删除最近使用最少的缓存项的策略。在Flutter项目中,我们可以使用LruCache来缓存一些经常需要使用到的数据或者对象,以提高应用程序的性能。

在Dart中,我们可以使用collection包中的LinkedHashMap来实现LruCache。

解决方案一:使用collection包中的LinkedHashMap实现LruCache




import 'package:collection/collection.dart';
 
class LruCache<K, V> {
  final int _maxSize;
  final Map<K, V> _map;
 
  LruCache(this._maxSize) : _map = LinkedHashMap<K, V>(
      equals: const DefaultEquality().equals,
      hashCode: const DefaultEquality().hash,
      isValidKey: const DefaultEquality().isValidKey,
    ) {
    assert(_maxSize > 0);
  }
 
  void put(K key, V value) {
    _map[key] = value;
    if (_map.length > _maxSize) {
      _map.remove(_map.keys.first);
    }
  }
 
  V get(K key) {
    final value = _map[key];
    if (value != null) {
      _map.remove(key);
      _map[key] = value;
    }
    return value;
  }
 
  void clear() {
    _map.clear();
  }
}

解决方案二:使用自定义实现实现LruCache




class LruCache<K, V> {
  final int _maxSize;
  final Map<K, _Entry<K, V>> _map = {};
  int _size = 0;
 
  LruCache(this._maxSize);
 
  void _addEntry(_Entry<K, V> entry) {
    _map[entry._key] = entry;
    _size++;
  }
 
  void _removeEntry(_Entry<K, V> entry) {
    _map.remove(entry._key);
    _size--;
  }
 
  void _moveToLast(_Entry<K, V> entry) {
    _removeEntry(entry);
    _addEntry(entry);
  }
 
  V put(K key, V value) {
    final entry = _Entry(key, value);
    if (_map.containsKey(key)) {
      _moveToLast(_map[key]!);
      return _map[key]!.value;
    } else {
      _addEntry(entry);
      while (_size > _maxSize) {
        final first = _map.entries.first;
        _removeEntry(first.value);
        _map.remove(first.key);
      }
    }
    return null;
  }
 
  V get(K key) {
    if (_map.containsKey(key)) {
      final entry = _map[key]!;
      _moveToLast(entry);
      return entry.value;
    }
    return null;
  }
 
  void clear() {
    _map.clear();
    _size = 0;
  }
 
  class _Entry<K, V> {
    final K _key;
    V value;
    _Entry<K, V>? _prev;
    _Entry<K, V>? _next;
 
    _Entry(this._key, this.value);
  }
}

在这两种解决方案中,我们都使用了一个内部类\_Entry来表示缓存项。在put方法中,我们首先检查是否已经存在该键值对,如果存在,我们将其移动到列表的末尾,并更新其值。如果不存在,我们将新的键值对添加到列表的末尾。当列表的大小超过最大值时,我们将列表中的第一个元素删除

none
最后修改于:2024年08月19日 19:13

评论已关闭

推荐阅读

DDPG 模型解析,附Pytorch完整代码
2024年11月24日
DQN 模型解析,附Pytorch完整代码
2024年11月24日
AIGC实战——Transformer模型
2024年12月01日
Socket TCP 和 UDP 编程基础(Python)
2024年11月30日
python , tcp , udp
如何使用 ChatGPT 进行学术润色?你需要这些指令
2024年12月01日
AI
最新 Python 调用 OpenAi 详细教程实现问答、图像合成、图像理解、语音合成、语音识别(详细教程)
2024年11月24日
ChatGPT 和 DALL·E 2 配合生成故事绘本
2024年12月01日
omegaconf,一个超强的 Python 库!
2024年11月24日
【视觉AIGC识别】误差特征、人脸伪造检测、其他类型假图检测
2024年12月01日
[超级详细]如何在深度学习训练模型过程中使用 GPU 加速
2024年11月29日
Python 物理引擎pymunk最完整教程
2024年11月27日
MediaPipe 人体姿态与手指关键点检测教程
2024年11月27日
深入了解 Taipy:Python 打造 Web 应用的全面教程
2024年11月26日
基于Transformer的时间序列预测模型
2024年11月25日
Python在金融大数据分析中的AI应用(股价分析、量化交易)实战
2024年11月25日
AIGC Gradio系列学习教程之Components
2024年12月01日
Python3 `asyncio` — 异步 I/O,事件循环和并发工具
2024年11月30日
llama-factory SFT系列教程:大模型在自定义数据集 LoRA 训练与部署
2024年12月01日
Python 多线程和多进程用法
2024年11月24日
Python socket详解,全网最全教程
2024年11月27日