From c2641bf97bd089a135053768f94b493c8a6a459a Mon Sep 17 00:00:00 2001 From: Looly Date: Tue, 18 Jun 2024 11:37:37 +0800 Subject: [PATCH] =?UTF-8?q?$=20bin/commit.sh=20Cache.put=E5=8F=98=E6=9B=B4?= =?UTF-8?q?=E7=AD=96=E7=95=A5=EF=BC=8C=E5=AF=B9=E4=BA=8E=E6=9B=BF=E6=8D=A2?= =?UTF-8?q?=E7=9A=84=E9=94=AE=E5=80=BC=E5=AF=B9=EF=BC=8C=E4=B8=8D=E6=B8=85?= =?UTF-8?q?=E7=90=86=E9=98=9F=E5=88=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hutool/core/cache/impl/AbstractCache.java | 15 +++++++++--- .../hutool/core/cache/Issue3618Test.java | 23 +++++++++++++++++++ 2 files changed, 35 insertions(+), 3 deletions(-) create mode 100644 hutool-core/src/test/java/org/dromara/hutool/core/cache/Issue3618Test.java 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()); + } +}