0

考虑有一些对象需要在一个类中重复使用多次。单独的每个对象可以很大,并且这样的对象的数量也可以非常大。此类对象的一个​​非常简单的示例可能是数据库中的记录。

将此类数据存储在 HAshMap 中,而不是每 10 行后再次查询到数据库可以帮助提高性能。但是,内存方面要求很高。

HashMap 怎么可能包含大量数据,但不能将所有数据都保存在内存中。如果它可以按需提供对象,那将是最好的吗?

4

2 回答 2

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);
于 2013-02-24T15:17:21.383 回答
1

通常,在实现可能很大的缓存时,您希望使用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。

于 2013-02-24T16:00:37.330 回答