public interface Map < K, V> {
V put ( K k, V v) ;
V get ( K k) ;
int size ( ) ;
interface Entry < K, V> {
K getKey ( ) ;
V getValues ( ) ;
}
}
public class HashMap < K, V> implements Map < K, V> {
private Entry< K, V> [ ] table = null;
private int size = 0 ;
public HashMap ( ) {
table = new Entry [ 16 ] ;
}
@Override
public V put ( K k, V v) {
int index = hash ( k) ;
Entry< K, V> entry = table[ index] ;
if ( entry == null) {
table[ index] = new Entry < > ( k, v, index, null) ;
size++ ;
} else {
table[ index] = new Entry < > ( k, v, index, entry) ;
size++ ;
}
return table[ index] . getValues ( ) ;
}
private int hash ( K k) {
int index = k. hashCode ( ) % 15 ;
return Math. abs ( index) ;
}
@Override
public V get ( K k) {
int index = hash ( k) ;
Entry< K, V> entry = getEntry ( k, index) ;
return entry == null? null: entry. getValues ( ) ;
}
@Override
public int size ( ) {
return size;
}
private Entry< K, V> getEntry ( K k, int index) {
for ( Entry< K, V> e = table[ index] ; e != null; e = e. next) {
if ( e. hash == index && k == e. getKey ( ) || e. getKey ( ) . equals ( k) ) {
return e;
}
}
return null;
}
class Entry < K, V> implements Map. Entry < K, V> {
K k;
V v;
int hash;
Entry< K, V> next;
public Entry ( K k, V v, int hash, Entry< K, V> next) {
this . k = k;
this . v = v;
this . hash = hash;
this . next = next;
}
@Override
public K getKey ( ) {
return k;
}
@Override
public V getValues ( ) {
return v;
}
}
}