diff --git a/src/main/java/xyz/zhouxy/plusone/commons/util/RegexTools.java b/src/main/java/xyz/zhouxy/plusone/commons/util/RegexTools.java index 20950cd..9890803 100644 --- a/src/main/java/xyz/zhouxy/plusone/commons/util/RegexTools.java +++ b/src/main/java/xyz/zhouxy/plusone/commons/util/RegexTools.java @@ -17,29 +17,40 @@ package xyz.zhouxy.plusone.commons.util; import java.util.Arrays; -import java.util.Map; import java.util.Objects; import java.util.Optional; -import java.util.concurrent.ConcurrentHashMap; import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.annotation.Nonnull; import javax.annotation.Nullable; +import com.google.common.cache.CacheBuilder; +import com.google.common.cache.CacheLoader; +import com.google.common.cache.LoadingCache; + /** - * 封装一些常用的正则操作,并可以缓存 {@link Pattern} 实例以复用(最多缓存大概 256 个)。 + * 封装一些常用的正则操作,并可以缓存 {@link Pattern} 实例以复用。 * * @author ZhouXY - * */ public final class RegexTools { - private static final int DEFAULT_CACHE_INITIAL_CAPACITY = 64; private static final int MAX_CACHE_SIZE = 256; private static final int DEFAULT_FLAG = 0; - private static final Map PATTERN_CACHE - = new ConcurrentHashMap<>(DEFAULT_CACHE_INITIAL_CAPACITY); + private static final LoadingCache PATTERN_CACHE = CacheBuilder + .newBuilder() + .maximumSize(MAX_CACHE_SIZE) + .build(new CacheLoader() { + @SuppressWarnings("null") + public Pattern load(@Nonnull RegexAndFlags regexAndFlags) { + return regexAndFlags.compilePattern(); + } + }); + + // ================================ + // #region - getPattern + // ================================ /** * 获取 {@link Pattern} 实例。 @@ -273,11 +284,7 @@ public final class RegexTools { @Nonnull private static Pattern cacheAndGetPatternInternal(final String pattern, final int flags) { final RegexAndFlags regexAndFlags = new RegexAndFlags(pattern, flags); - if (PATTERN_CACHE.size() < MAX_CACHE_SIZE) { - return PATTERN_CACHE.computeIfAbsent(regexAndFlags, RegexAndFlags::compilePattern); - } - return Optional.ofNullable(PATTERN_CACHE.get(regexAndFlags)) - .orElseGet(regexAndFlags::compilePattern); + return PATTERN_CACHE.getUnchecked(regexAndFlags); } /** @@ -290,7 +297,7 @@ public final class RegexTools { @Nonnull private static Pattern getPatternInternal(final String pattern, final int flags) { final RegexAndFlags regexAndFlags = new RegexAndFlags(pattern, flags); - return Optional.ofNullable(PATTERN_CACHE.get(regexAndFlags)) + return Optional.ofNullable(PATTERN_CACHE.getIfPresent(regexAndFlags)) .orElseGet(regexAndFlags::compilePattern); }