java HashMap的简单实现

package com.other.test;

import java.util.HashMap;
/**
 * HashMap的简单实现
 * @author txxs
 *
 */
public class MyOwnHashMap {
	/**
	 * 取数组的大小为16
	 */
	private static final int SIZE = 16;
	private Entry table[] = new Entry[SIZE];

	/**
	 * 我们要用key和value定义一个简单的Map数据结构
	 * 它还用在链表中的桶的冲突处理,如果多个键值对有
	 * 相同的hashcode,但是有不同的key,使用指针“next”
	 */
	class Entry {
		final String key;
		String value;
		Entry next;

		Entry(String k, String v) {
			key = k;
			value = v;
		}

		public String getValue() {
			return value;
		}

		public void setValue(String value) {
			this.value = value;
		}

		public String getKey() {
				return key;
		}
	}

	/**在我们自己实现的HashMap中根据key返回value,
	 * 如果是没有和key对应的value返回空
	*/
	public Entry get(String k) {
		int hash = k.hashCode() % SIZE;
		Entry e = table[hash];

		//如果找到了对应的桶,那么就沿着链寻找看看与key对应的value是否存在
		while(e != null) {
			if(e.key.equals(k)) {
				return e;
			}
			e = e.next;
		}
		return null;
	}

	/**
	 * 在map中将特定的key和value关联起来。
	 * 如果包含了相同的key,原来的旧值将会被替换掉
	*/
	public void put(String k, String v) {
		int hash=k.hashCode()%SIZE;
		Entry e=table[hash];
		if(e!=null){
			//检查是否有相同的key,如果有用新值代替旧值
			while(e.next!=null){
				if(e.key.equals(k)){
					e.value=v;
					return ;
				}
				e=e.next;
			}
			//在链的末尾添加新的元素
			Entry entryInOldBucket=new Entry(k,v);
			e.next=entryInOldBucket;
		}
		else{
		//建立一个新桶
		Entry entryInNewBucket=new Entry(k,v);
		table[hash]=entryInNewBucket;
		}

	}

	// 测试
	public static void main(String[] args) {
		MyOwnHashMap tmhm = new MyOwnHashMap();
		HashMap map = new HashMap();
		map.put("Niranjan", "SMTS");
		map.put("Ananth", "SSE");
		map.put("Niranjan", "SMTS1");
		map.put("Chandu", "SSE");
		tmhm.put("Niranjan", "SMTS");
		tmhm.put("Ananth", "SSE");
		tmhm.put("Niranjan", "SMTS1");
		tmhm.put("Chandu", "SSE");

		//设置开始时间
		long startTime = System.nanoTime(); 
		Entry e = tmhm.get("Niranjan");
		//设置结束时间
		long endTime = System.nanoTime();  
		long duration = endTime - startTime;  
		System.out.println("自己实现的HashMap " + duration);  
		    
		//设置开始时间
		startTime = System.nanoTime(); 
		String mapResult = (String) map.get("Niranjan");
		//设置结束时间
		endTime = System.nanoTime();  
		duration = endTime - startTime;  
		System.out.println("原有的java.util.HashMap " + duration);  
		
		System.out.println("自己实现的Map取值: "+e.getValue());
		System.out.println("原有的java.util.HashMap取值: "+mapResult);
	}

}

关注我,获取400个的赚钱金点子,轻松开启副业生涯

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值