2017-04-14 56 views
0

我想&從CacheGuava:Cache.asMap()。remove()更好嗎?

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方法克隆的所有項目?這是一個沉重的電話嗎?如果考慮性能,哪種方式更好。

回答

1

有因爲Cache#asMap()被定義爲呼叫之間沒有真正的區別:

返回存儲在該緩存作爲一個線程安全的映射條目的視圖。 對地圖所做的修改直接影響緩存

調用asMap()可以會略有減少高性能的(因爲它是可能的一個觀點必須創建),但時間是恆定的(可忽略不計),是一個實現細節(詳見內部番石榴LocalCache and LocalManualCache classes)。

什麼是更重要的,是Cache#invalidate(K)更地道,我會建議使用它,而不是地圖視圖方法(以下後@BenManes'註釋編輯)如果你不需要與該鍵關聯返回的值,否則使用地圖視圖。

+3

雖然更習慣,但在需要刪除值的情況下,該視圖非常有用。這種操作是原子的,而他執行兩種操作的選擇是活潑的。 Cache接口提供了一種習慣的和簡單的抽象,而該視圖爲更高級的需求提供了逃生艙口。 –

+0

@BenManes你說得對,我沒有看到OP需要使用刪除的值。 – Xaerxess