如何构建键为大小写不敏感字符串的Guava LoadingCache
实现Guava LoadingCache的大小写不敏感键
完全可行,你不需要让调用者提前转换键的大小写,只需通过Guava的CacheBuilder.keyEquivalence()方法自定义键的等价性判断逻辑,就能让缓存自行处理大小写不敏感的匹配。
具体实现步骤
1. 定义大小写不敏感的键等价规则
创建一个Equivalence<String>实例,重写等价性判断和哈希计算逻辑:
Equivalence<String> caseInsensitiveEquivalence = new Equivalence<String>() { @Override protected boolean doEquivalent(String a, String b) { // 忽略大小写判断两个字符串是否等价 return a.equalsIgnoreCase(b); } @Override protected int doHash(String s) { // 基于小写字符串计算哈希值,保证哈希一致性 return s.toLowerCase().hashCode(); } };
2. 构建带有自定义等价规则的LoadingCache
在缓存构建时指定上述等价规则:
LoadingCache<String, MyObject> myCache = CacheBuilder.newBuilder() .keyEquivalence(caseInsensitiveEquivalence) .build(new CacheLoader<String, MyObject>() { @Override public MyObject load(final String key) { // 这里可以直接使用调用者传入的原key,无需转换 // 如果业务方法需要统一大小写的键,可在这里转成小写/大写后传入 return myMethod(key); } });
关键说明
- 缓存会依据自定义的等价规则判断键是否匹配,调用者传入
"KEY"、"key"或"Key"都会命中同一个缓存条目。 - 哈希计算使用小写字符串的哈希值,确保相同语义的键(大小写不同)会被映射到哈希表的同一个桶,避免缓存击穿或重复加载。
- 如果你的
myMethod依赖键的原始大小写格式,直接使用传入的key即可;若业务需要统一格式,可在load方法内部自行转换。
内容的提问来源于stack exchange,提问作者user3130010
相关产品推荐
相关产品推荐

