番石榴:Cache.asMap().remove() 更好吗?
Guava : Is Cache.asMap().remove() better?
我想从 Cache
中获取并删除一个项目
final Cache<String, PendingRequest> pendingRequest = CacheBuilder.newBuilder().build();
// get first
pendingCall = pendingRequest.getIfPresent(key);
pendingRequest.invalidate(key); // then remove.
我也找到了另一种方法
pendingCall = pendingRequest.asMap().remove(key);
asMap
方法是否克隆所有项目?这是一个沉重的电话吗?如果考虑性能,哪种方式更好。
这些调用之间没有真正的区别,因为 Cache#asMap()
定义为:
Returns a view of the entries stored in this cache as a thread-safe map. Modifications made to the map directly affect the cache.
调用asMap()
可能性能稍差(因为可能必须创建一个视图)但是时间是恒定的(并且可以忽略不计)并且是一个实现详细信息(有关详细信息,请参阅内部 Guava LocalCache
and LocalManualCache
classes)。
更重要的是,Cache#invalidate(K)
更惯用,我建议您使用它而不是地图视图方法 (在下面@BenManes 的评论后编辑) 如果您不需要与键关联的返回值,否则使用地图视图。
我想从 Cache
final Cache<String, PendingRequest> pendingRequest = CacheBuilder.newBuilder().build();
// get first
pendingCall = pendingRequest.getIfPresent(key);
pendingRequest.invalidate(key); // then remove.
我也找到了另一种方法
pendingCall = pendingRequest.asMap().remove(key);
asMap
方法是否克隆所有项目?这是一个沉重的电话吗?如果考虑性能,哪种方式更好。
这些调用之间没有真正的区别,因为 Cache#asMap()
定义为:
Returns a view of the entries stored in this cache as a thread-safe map. Modifications made to the map directly affect the cache.
调用asMap()
可能性能稍差(因为可能必须创建一个视图)但是时间是恒定的(并且可以忽略不计)并且是一个实现详细信息(有关详细信息,请参阅内部 Guava LocalCache
and LocalManualCache
classes)。
更重要的是,Cache#invalidate(K)
更惯用,我建议您使用它而不是地图视图方法 (在下面@BenManes 的评论后编辑) 如果您不需要与键关联的返回值,否则使用地图视图。