diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/cache/impl/AbstractCache.java b/hutool-core/src/main/java/org/dromara/hutool/core/cache/impl/AbstractCache.java index 17c8647ab..9ff45a84f 100644 --- a/hutool-core/src/main/java/org/dromara/hutool/core/cache/impl/AbstractCache.java +++ b/hutool-core/src/main/java/org/dromara/hutool/core/cache/impl/AbstractCache.java @@ -96,10 +96,19 @@ public abstract class AbstractCache implements Cache { if (timeout != 0) { existCustomTimeout = true; } - if (isFull()) { - pruneCache(); + + final MutableObj mKey = MutableObj.of(key); + + // issue#3618 对于替换的键值对,不做满队列检查和清除 + if (cacheMap.containsKey(mKey)) { + // 存在相同key,覆盖之 + cacheMap.put(mKey, co); + } else { + if (isFull()) { + pruneCache(); + } + cacheMap.put(mKey, co); } - cacheMap.put(MutableObj.of(key), co); } // ---------------------------------------------------------------- put end diff --git a/hutool-core/src/test/java/org/dromara/hutool/core/cache/Issue3618Test.java b/hutool-core/src/test/java/org/dromara/hutool/core/cache/Issue3618Test.java new file mode 100644 index 000000000..b81b58421 --- /dev/null +++ b/hutool-core/src/test/java/org/dromara/hutool/core/cache/Issue3618Test.java @@ -0,0 +1,23 @@ +package org.dromara.hutool.core.cache; + +import org.dromara.hutool.core.cache.impl.FIFOCache; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class Issue3618Test { + @Test + public void putTest() { + final FIFOCache cache = CacheUtil.newFIFOCache(3); + cache.put(1, 1); + cache.put(2, 1); + cache.put(3, 1); + + assertEquals(3, cache.size()); + + // issue#3618 对于替换的键值对,不做满队列检查和清除 + cache.put(3, 2); + + assertEquals(3, cache.size()); + } +}