返回介绍

4.7 LruCache.trimToSize(int maxSize)

发布于 2024-12-23 21:09:30 字数 1140 浏览 0 评论 0 收藏 0

public void trimToSize(int maxSize) {
  /*
   * 这是一个死循环,
   * 1.只有 扩容 的情况下能立即跳出
   * 2.非扩容的情况下,map 的数据会一个一个删除,直到 map 里没有值了,就会跳出
   */
  while (true) {
    K key;
    V value;
    synchronized (this) {
      // 在重新调整容量大小前,本身容量就为空的话,会出异常的。
      if (size < 0 || (map.isEmpty() && size != 0)) {
        throw new IllegalStateException(
            getClass().getName() + ".sizeOf() is reporting inconsistent results!");
      }
      // 如果是 扩容 或者 map 为空了,就会中断,因为扩容不会涉及到丢弃数据的情况
      if (size <= maxSize || map.isEmpty()) {
        break;
      }

      Map.Entry<K, V> toEvict = map.entrySet().iterator().next();
      key = toEvict.getKey();
      value = toEvict.getValue();
      map.remove(key);
      // 拿到键值对,计算出在容量中的相对长度,然后减去。
      size -= safeSizeOf(key, value);
      // 添加一次收回次数
      evictionCount++;
    }
    /*
     * 将最后一次删除的最少访问数据回调出去
     */
    entryRemoved(true, key, value, null);
  }
}

简单描述:会判断之前 size 是否大于 maxSize 。是的话,直接跳出后什么也不做。不是的话,证明已经溢出容量了。由 makeTail 图已知,最近经常访问的数据在最末尾。拿到一个存放 key 的 Set,然后一直一直从头开始删除,删一个判断是否溢出,直到没有溢出。


最后看看:

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文