Slight optimizations to putAll() and flush() and added a comment

as to why the algorithm in flush() even properly flushes in LRU order.


git-svn-id: https://samskivert.googlecode.com/svn/trunk@1144 6335cc39-0255-0410-8fd6-9bcaacd3b74c
This commit is contained in:
ray
2003-06-05 18:02:24 +00:00
parent 95fa0e517d
commit 3c8108a010
@@ -1,5 +1,5 @@
// //
// $Id: LRUHashMap.java,v 1.5 2003/04/27 07:37:32 mdb Exp $ // $Id: LRUHashMap.java,v 1.6 2003/06/05 18:02:24 ray Exp $
package com.samskivert.util; package com.samskivert.util;
@@ -172,9 +172,7 @@ public class LRUHashMap implements Map
// updated our computed "size" // updated our computed "size"
_size += _sizer.computeSize(value); _size += _sizer.computeSize(value);
if (result != null) { entryRemoved(result);
_size -= _sizer.computeSize(result);
}
// System.out.println("Added " + value + ": " + _size); // System.out.println("Added " + value + ": " + _size);
// flush if needed // flush if needed
@@ -193,37 +191,46 @@ public class LRUHashMap implements Map
return; return;
} }
// if we've exceeded our size, remove things until we're back // If we've exceeded our size, remove things until we're back
// under the required size; but don't freak out if we have one // under the required size.
// *really* big item if (_size > _maxSize) {
// int removed = 0; // This works because the entrySet iterator of a LinkedHashMap
while (_size > _maxSize && size() > 1) { // returns the entries in LRU order
Object key = keySet().iterator().next(); Iterator iter = entrySet().iterator();
remove(key); // don't remove the last entry, even if it's too big, because
// removed += _sizer.computeSize(remove(key)); // a cache with nothing in it sucks
for (int ii=size(); (ii > 1) && (_size > _maxSize); ii--) {
Map.Entry entry = (Map.Entry) iter.next();
entryRemoved(entry.getValue());
iter.remove();
}
}
}
/**
* Adjust our size to reflect the removal of the specified entry.
*/
protected void entryRemoved (Object entry)
{
if (entry != null) {
_size -= _sizer.computeSize(entry);
} }
// if (removed > 0) {
// System.out.println("Removed " + removed + ": " + _size);
// }
} }
// documentation inherited from interface // documentation inherited from interface
public Object remove (Object key) public Object remove (Object key)
{ {
Object removed = _delegate.remove(key); Object removed = _delegate.remove(key);
if (removed != null) { entryRemoved(removed);
_size -= _sizer.computeSize(removed);
}
return removed; return removed;
} }
// documentation inherited from interface // documentation inherited from interface
public void putAll (Map t) public void putAll (Map t)
{ {
Iterator i = t.keySet().iterator(); for (Iterator iter = t.entrySet().iterator(); iter.hasNext(); ) {
while (i.hasNext()) { Map.Entry entry = (Map.Entry) iter.next();
Object key = i.next(); put(entry.getKey(), entry.getValue());
put(key, t.get(key));
} }
} }