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:
@@ -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));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user