定义接口:
public interface MyMap<K,V> {
public V put(K k,V v);
public V get(K k,V v);
public int size();
interface Entry<K,V>{
K getKey();
V getValue();
V setValue(V value);
Entry<K,V> getNext();
Entry<K,V> setNext(Entry<K,V> next);
}
}
实现接口方法:
public class MyHashMap<K,V> implements MyMap<K, V>{
private Entry<K,V> table[] =null;
private static int defaultLength=1<<4; //aka 16
private int size;
private static double defaultLoad= 0.75f;
@Override
public V put(K k, V v) {
if(table==null){
table=new Entry[this.defaultLength];
}
resize();
int index=getIndex(k,this.defaultLength);
MyMap.Entry<K, V> entry=table[index];
while(entry!=null){
if(entry.getKey().equals(k)){
return entry.setValue(v);
}else{
entry=entry.getNext();
}
}
table[index]=new MyEntry<>(k,v,table[index]);
this.size++;
return v;
}
private void resize() {
// 重新散列
if(size>=this.defaultLength*this.defaultLoad){
Entry<K,V> newTable[] =new Entry[this.defaultLength<<1]; //aka *2
MyMap.Entry<K, V> entry=null;
for(int i=0;i<table.length;i++){
entry=table[i];
while(entry!=null){
int index=getIndex(entry.getKey(),newTable.length);
MyMap.Entry<K, V> oldEntry=entry.getNext();
entry.setNext(newTable[index]);
newTable[index]=entry;
entry=oldEntry;
}
}
table=newTable;
this.defaultLength=newTable.length;
newTable=null;
}
}
private int getIndex(K k,int length) {
if(k==null){
return 0;
}
int hash=k.hashCode();
return hash & (length-1);
}
@Override
public V get(K k, V v) {
if(table!=null){
int index=getIndex(k,this.defaultLength);
Entry<K,V> entry=table[index];
if(entry!=null){
if(entry.getKey().equals(k)){
return entry.getValue();
}else{
entry=entry.getNext();
}
}
return entry.getValue();
}
return null;
}
@Override
public int size() {
return this.size;
}
class MyEntry<K,V> implements MyMap.Entry<K, V>{
K key;
V value;
MyMap.Entry<K, V> next;
public MyEntry(K key, V value, com.yunxi.MyMap.Entry<K, V> next) {
super();
this.key = key;
this.value = value;
this.next = next;
}
@Override
public K getKey() {
// TODO Auto-generated method stub
return this.key;
}
@Override
public V getValue() {
return this.value;
}
@Override
public V setValue(V value) {
V oldValue=this.value;
this.value=value;
return oldValue;
}
@Override
public com.yunxi.MyMap.Entry<K, V> getNext() {
// TODO Auto-generated method stub
return this.next;
}
@Override
public com.yunxi.MyMap.Entry<K, V> setNext(com.yunxi.MyMap.Entry<K, V> next) {
MyMap.Entry<K, V> oldNext=this.next;
this.next=next;
return oldNext;
}
}
}