// $Id: AgingHash.java,v 1.1 2001-05-02 06:14:15 cvs Exp $
package dmg.cells.services.login.user ;
import java.util.Hashtable;
public class AgingHash {
private int _maxSize;
private Node _first;
private Node _last;
private Hashtable<Object, Node> _hash = new Hashtable<>() ;
private static class Node {
private Node( Object key , Object value ){
this.value = value ;
this.key = key ;
}
private Object value;
private Object key;
private Node next;
private Node previous;
public String toString(){
return "(" + key + ':' + value + ')';
// return "("+key+":"+value+":"+previous+":"+next+")" ;
}
}
public AgingHash( int maxSize ){
_maxSize = maxSize ;
}
public synchronized Object get( Object key ){
if( key == null ) {
throw new
IllegalArgumentException("Key == null");
}
Node node = _hash.get( key );
if( node == null ) {
return null;
}
unlink( node ) ;
link( node ) ;
return node.value ;
}
public synchronized void put( Object key , Object value ){
if( ( key == null ) || ( value == null ) ) {
throw new
IllegalArgumentException("Key/Value == null");
}
//
Node node = _hash.get( key );
if( node == null ){
node = new Node(key, value);
_hash.put( key , node ) ;
}else{
node.value = value ;
//
// we have to relink to become top of stack.
//
unlink( node ) ;
}
link( node ) ;
if( _hash.size() > _maxSize ){
_hash.remove( _last.key ) ;
unlink( _last ) ;
}
}
public synchronized Object remove( Object key ){
Node node = _hash.remove( key );
if( node == null ) {
return null;
}
unlink( node ) ;
return node.value ;
}
private void link( Node node ){
node.next = _first ;
node.previous = null ;
if( _first != null ) {
_first.previous = node;
}
_first = node ;
if( _last == null ) {
_last = node;
}
}
private void unlink( Node node ){
if( node.next != null ) {
node.next.previous = node.previous;
} else {
_last = node.previous;
}
if( node.previous != null ) {
node.previous.next = node.next;
} else {
_first = node.next;
}
}
public String display(){
Node node;
StringBuilder sb = new StringBuilder() ;
for( node = _first ; node != null ; node = node.next ){
sb.append(node).append(';') ;
}
sb.append('[').append(_first).append(';').append(_last).append(']');
return sb.toString() ;
}
public static void main( String [] args ){
AgingHash hash = new AgingHash(3) ;
System.out.println( hash.display() ) ;
hash.put("1","1");
System.out.println( hash.display() ) ;
hash.put("2","2");
System.out.println( hash.display() ) ;
hash.put("3","3");
System.out.println( hash.display() ) ;
hash.put("4","4");
System.out.println( hash.display() ) ;
hash.put("5","5");
System.out.println( hash.display() ) ;
hash.remove("4");
System.out.println( hash.display() ) ;
hash.remove("3");
System.out.println( hash.display() ) ;
hash.remove("5");
System.out.println( hash.display() ) ;
}
}