手写简单的HashMap V1

定义接口:

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;
		}

	}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值