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