From 2e9e17459455a7f1d32359e5131fb3241d5b9156 Mon Sep 17 00:00:00 2001 From: Looly Date: Tue, 24 Mar 2020 17:43:58 +0800 Subject: [PATCH] change capacity --- CHANGELOG.md | 1 + .../java/cn/hutool/cache/impl/FIFOCache.java | 17 ++++++----------- .../java/cn/hutool/cache/impl/LRUCache.java | 8 ++++---- 3 files changed, 11 insertions(+), 15 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 19ca65854..05e662ea6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ * 【core 】 增加CityHash算法 * 【core 】 PageUtil支持setFirstPageNo自定义第一页的页码(issue#I1CGNZ@Gitee) * 【http 】 UserAgentUtil增加Chromium内核的Edge浏览器支持(issue#800@Github) +* 【cache 】 修改FIFOCache中linkedHashMap的初始容量策略(pr#801@Github) ### Bug修复 * 【core 】 修复NumberWordFormatter拼写错误(issue#799@Github) diff --git a/hutool-cache/src/main/java/cn/hutool/cache/impl/FIFOCache.java b/hutool-cache/src/main/java/cn/hutool/cache/impl/FIFOCache.java index ae25c4bc9..12753cac5 100644 --- a/hutool-cache/src/main/java/cn/hutool/cache/impl/FIFOCache.java +++ b/hutool-cache/src/main/java/cn/hutool/cache/impl/FIFOCache.java @@ -11,18 +11,17 @@ import java.util.LinkedHashMap; * 优点:简单快速
* 缺点:不灵活,不能保证最常用的对象总是被保留 *

- * - * @author Looly * * @param 键类型 * @param 值类型 + * @author Looly */ public class FIFOCache extends AbstractCache { private static final long serialVersionUID = 1L; /** * 构造,默认对象不过期 - * + * * @param capacity 容量 */ public FIFOCache(int capacity) { @@ -31,18 +30,14 @@ public class FIFOCache extends AbstractCache { /** * 构造 - * + * * @param capacity 容量 - * @param timeout 过期时长 + * @param timeout 过期时长 */ public FIFOCache(int capacity, long timeout) { - if(Integer.MAX_VALUE == capacity) { - capacity -= 1; - } - this.capacity = capacity; this.timeout = timeout; - cacheMap = new LinkedHashMap<>(capacity + 1, 1.0f, false); + cacheMap = new LinkedHashMap<>(Math.max(1 << 4, capacity >>> 7), 1.0f, false); } /** @@ -53,7 +48,7 @@ public class FIFOCache extends AbstractCache { protected int pruneCache() { int count = 0; CacheObj first = null; - + // 清理过期对象并找出链表头部元素(先入元素) Iterator> values = cacheMap.values().iterator(); while (values.hasNext()) { diff --git a/hutool-cache/src/main/java/cn/hutool/cache/impl/LRUCache.java b/hutool-cache/src/main/java/cn/hutool/cache/impl/LRUCache.java index dcf0fe785..84d271565 100644 --- a/hutool-cache/src/main/java/cn/hutool/cache/impl/LRUCache.java +++ b/hutool-cache/src/main/java/cn/hutool/cache/impl/LRUCache.java @@ -1,9 +1,9 @@ package cn.hutool.cache.impl; -import java.util.Iterator; - import cn.hutool.core.map.FixedLinkedHashMap; +import java.util.Iterator; + /** * LRU (least recently used)最近最久未使用缓存
* 根据使用时间来判定对象是否被持续缓存
@@ -37,12 +37,12 @@ public class LRUCache extends AbstractCache { if(Integer.MAX_VALUE == capacity) { capacity -= 1; } - + this.capacity = capacity; this.timeout = timeout; //链表key按照访问顺序排序,调用get方法后,会将这次访问的元素移至头部 - cacheMap = new FixedLinkedHashMap>(capacity); + cacheMap = new FixedLinkedHashMap<>(capacity); } // ---------------------------------------------------------------- prune