2017-03-06 60 views
0

我想用这种方式为一组带有LRU驱逐策略的字符串创建一个缓存。在Java中缓存一套使用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; 
      } 
     }); 

我想我只用一个对象作为所有元素的值来保存空间,我正确吗?你知道有没有其他的空间有效的方式来做到这一点?谢谢。

回答

2

不,你没有节省空间。

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

而且,除非我愿意接受这样的事实“缓存可以驱逐一个条目,因为它一直没有使用最近或经常”(CacheBuilder.maximumSize(long)强调我不会用番石榴的Cache一个LRU加入了)。

如果你想有一个直线上升的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实现(S),在那里,不叫Boolean.valueOf(boolean)(或类似的东西)在运行时自动装箱boolean元时,但如果这样的实现存在,我相当有信心,你没有使用它,并且如果有任何个人是非常少的。从Boolean(boolean)

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

+0

感谢您的详细解答。所以,我认为我正在浪费参考PLACEHOLDER的空间。对我来说,Guava的缓存没关系。我可以使用任何其他对象类型来节省更多空间,而不是使用“true”或“false”? – theeminence

+0

@theeminence Guava Cache已经非常小巧了。我不知道有什么方法可以进一步减少存储空间。 – mfulton26