使用Java中的LRU驱逐策略缓存一组字符串

the*_*nce 1 java memory caching guava

我试图以这种方式为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;
            }
        });
Run Code Online (Sandbox Code Playgroud)

我想我只使用一个对象作为所有元素的值来节省空间,我是否正确?你知道其他任何节省空间的方法吗?谢谢.

mfu*_*n26 6

不,你没有节省空间.

当JVM*自动装箱时,boolean它会调用Boolean.valueOf(boolean)哪个返回Boolean.TRUEBoolean.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;
    }
});
Run Code Online (Sandbox Code Playgroud)

你定义的地方MAX_ENTRIES.


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

注意:使用此构造函数很少是合适的.除非需要实例,否则静态工厂valueOf(boolean)通常是更好的选择.它可能会产生明显更好的空间和时间性能.