gpt4 book ai didi

java - 在 Java 中使用 LRU 逐出策略缓存一组字符串

转载 作者:行者123 更新时间:2023-11-29 06:52:37 25 4
gpt4 key购买 nike

我正在尝试以这种方式使用 LRU 逐出策略为一组字符串创建缓存。

private static final Boolean PLACEHOLDER = true;
LoadingCache<String, Boolean> scannedIDsCache = CacheBuilder.newBuilder()
.build(new CacheLoader<String, Boolean>() {
@Override
public Boolean load(String key) throws Exception {
return PLACEHOLDER;
}
});

我认为我只使用一个对象作为所有元素的值来节省空间,对吗?您知道其他节省空间的方法吗?谢谢。

最佳答案

不,你没有节省空间。

当 JVM* autoboxes一个boolean它调用 Boolean.valueOf(boolean) 返回 Boolean.TRUE Boolean.FALSE 这是static final Boolean领域。它不会创建新的 Boolean 实例。因此,PLACEHOLDER您定义的实际上是对 Boolean.TRUE 的引用并且是多余的。

此外,我不会使用 Guava 的 Cache对于 LRU,除非我愿意接受这样一个事实,即“缓存可能会驱逐一个条目,因为它最近没有被使用过或经常”(CacheBuilder.maximumSize(long)强调> 已添加)。

如果你想要一个直接的 LRU,你可以使用 Collections.newSetFromMap(Map) LinkedHashMap :

Set<String> cache = Collections.newSetFromMap(new LinkedHashMap<String, Boolean>() {
@Override
protected boolean removeEldestEntry(Map.Entry<String, Boolean> eldest) {
return size() > MAX_ENTRIES;
}
});

在哪里定义 MAX_ENTRIES .


*注意:理论上可能有一些 JVM 实现不调用 Boolean.valueOf(boolean) (或类似的东西)在运行时自动装箱 boolean原语,但如果存在这样的实现,我相信你不会使用它,而且很少有人使用它。来自 Boolean(boolean) :

Note: It is rarely appropriate to use this constructor. Unless a new instance is required, the static factory valueOf(boolean) is generally a better choice. It is likely to yield significantly better space and time performance.

关于java - 在 Java 中使用 LRU 逐出策略缓存一组字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42635283/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com