考虑有一些对象需要在一个类中重复使用多次。单独的每个对象可以很大,并且这样的对象的数量也可以非常大。此类对象的一个非常简单的示例可能是数据库中的记录。
将此类数据存储在 HAshMap 中,而不是每 10 行后再次查询到数据库可以帮助提高性能。但是,内存方面要求很高。
HashMap 怎么可能包含大量数据,但不能将所有数据都保存在内存中。如果它可以按需提供对象,那将是最好的吗?
您可以使用基于 LRU 的映射进行缓存,并且缓存大小的长度是固定的, Least-Recently-Used
对象将保留在内存中。
在java中很容易得到这样的地图,[LinkedHashMap][1]
.
final int MAX_ENTRIES = 100;
Map cache = new LinkedHashMap(MAX_ENTRIES+1, .75F, true) {
// Returns true if this map should remove its eldest entry
public boolean removeEldestEntry(Map.Entry eldest) {
return size() > MAX_ENTRIES;
}
};
您还可以使您的Map
同步。
Map m = Collections.synchronizedMap(cache);
通常,在实现可能很大的缓存时,您希望使用SoftReference。通常它看起来像这样:
private final Map<KeyType, Reference<MyLargeObject>> cache =
new HashMap<>(); // Or LinkedHashMap, as per Quoi's suggestion
public MyLargeObject getCachedValue(KeyType key) {
Reference<MyLargeObject> ref = cache.get(key);
return (ref != null ? ref.get() : null);
}
public void addToCache(KeyType key, MyLargeObject value) {
cache.put(key, new SoftReference<MyLargeObject>(value));
}
SoftReference 持有一个对象,但如果内存变得紧张,将允许对该对象进行垃圾收集。如果对象确实被垃圾回收,SoftReference.get() 返回 null。