考虑有些对象需要在类中重复使用次数。 个别地,每个对象可以很大,并且这些对象的数量也可以非常大。这种对象的一个非常简单的例子可能是数据库中的记录。
将此类数据存储在HAshMap中,而不是每10行后再次查询数据库有助于提高性能。但是,记忆方面,这是非常苛刻的。
HashMap如何包含大量数据,但不能将所有内容保存在一个内存中。如果能按需提供对象,那最好吗?
答案 0 :(得分:3)
您可以使用基于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);
答案 1 :(得分:1)
通常,在实现可能较大的缓存时,您需要使用SoftReference s。通常它看起来像这样:
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。