tags:

views:

1617

answers:

3

I know it's simple to implement, but I want to reuse something that already exist.

Problem I want to solve is that I load configuration (from XML so I want to cache them) for different pages, roles, ... so the combination of inputs can grow quite much (but in 99% will not). To handle this 1%, I want to have some max number of items in cache...

Till know I have found org.apache.commons.collections.map.LRUMap in apache commons and it looks fine but want to check also something else. Any recommendations?

+7  A: 

You can use a LinkedHashMap (Java 1.4+) :

The code from exampledepot.com:

// Create cache
final int MAX_ENTRIES = 100;
Map cache = new LinkedHashMap(MAX_ENTRIES+1, .75F, true) {
    // This method is called just after a new entry has been added
    public boolean removeEldestEntry(Map.Entry eldest) {
        return size() > MAX_ENTRIES;
    }
};

// Add to cache
Object key = "key";
cache.put(key, object);

// Get object
Object o = cache.get(key);
if (o == null && !cache.containsKey(key)) {
    // Object not in cache. If null is not a possible value in the cache,
    // the call to cache.contains(key) is not needed
}

// If the cache is to be used by multiple threads,
// the cache must be wrapped with code to synchronize the methods
cache = (Map)Collections.synchronizedMap(cache);
Guido
LRUMap from commons collections is a good choice as well.
Guido
OK, so I decided to use LRUMap.
Supowski
Just a note - both your links go to the same example, I think the former should be the LHM javadoc?
JeeBee
I discovered that aspect of the LinkedHashMap today and it's amazing how simple it is. Lesson Learned : Know your API.
Julien Grenier
A: 

whirlycache seems pretty easy and is apparently quite fast. I haven't used it myself yet, though.

Sebastian
The link is currently broken. Can you (or anyone) fix this?
dmeister
A: 

what a great LinkedHashMap, i know it deep just now

tenebaul