首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Cache.asMap().put()或Cache.put()

Cache.asMap().put()或Cache.put()
EN

Stack Overflow用户
提问于 2019-04-30 04:48:16
回答 2查看 1.6K关注 0票数 0

我在使用谷歌番石榴缓存。定义为:

代码语言:javascript
复制
Cache<String, String> myCache= CacheBuilder.newBuilder().maximumSize(100).build();  

当我执行地图操作(如get/put )时,请使用:

代码语言:javascript
复制
  myCache.asMap().put("someString", "someString");
  String someValueFromCache = myCache.asMap().get("someString");

我想知道,如果我按照以下方式使用它,是否会有任何优化或任何不同之处,即不使用它作为地图:

代码语言:javascript
复制
  myCache.put("someString", "someString");
  String someValueFromCache = myCache.get("someString");
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-04-30 04:55:19

从番石榴缓存文档:https://github.com/google/guava/wiki/CachesExplained#inserted-directly

值可以直接用cache.put(key,value)插入缓存中。这将覆盖指定键的缓存中的任何先前条目。还可以使用由ConcurrentMap ()视图公开的任何Cache.asMap方法对缓存进行更改。请注意,asMap视图上的任何方法都不会导致条目自动加载到缓存中。此外,该视图上的原子操作超出了自动缓存加载的范围,因此在使用Cache.get或可调用的缓存加载值的缓存中,Cache.asMap(K,可调用)应该总是优于Cache.asMap().putIfAbsent。

不要认为您应该使用asMap()视图来修改缓存。

票数 3
EN

Stack Overflow用户

发布于 2019-04-30 08:47:02

除了@rdas的答复外,夫妇还注意到:

  1. 如果您不使用LoadingCache (如您的示例中所示),两者实际上没有区别(嗯,使用.asMap()比较混乱),有时您希望/必须使用(Concurrent)Map接口来实现兼容性,在这种情况下,使用.asMap()是非常好的。
  2. 如果您想对所有键/值进行访问/迭代,Cache接口不提供这样的方法,但是Map提供--参见 without passing any keys"
  3. 还有其他不同之处(实际上是在文档中,但我很难理解):如果您通过Cache通过CacheBuilder#recordStats()启用了CacheStats,那么通过它的.asMap()视图修改它们不会更新CacheStats
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55914135

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档