Java Map底层实现思路

<pre name="code" class="java">package cn.com.commsoft.map;

/**
 * 
 * @author wengle
 *Java中规定,两个内容相同的对象
 *(指的是通过调用equals方法返回true的对象),应该具有相等的hashcode
 *1、上面的话,相当于equals返回true的两个对象,就具有相同的hashcode,
 *但是具有相同hashcode的对象,通过调用equals方法不一定返回true(Map就是一个例子)
 *2、重写了equals方法,就必须重写hashcode方法,为了保证上面的Java规定
 */




public class MyMap {
	MyEntry[] arr = new MyEntry[100];
	int size;
	/**
	 * 采用hash算法实现map,(每个对象都有一个地址,
	 * 根据地址生成的一个hash码,由于每个对象的地址都不一样,所以
	 * 生成的hash码是唯一的)
	 * @param key
	 * @param value
	 */
	public void put(Object key, Object value){
		MyEntry my = new MyEntry(key, value);
		//相当于地址映射函数,但是会产生地址映射冲突
		int a = (key.hashCode()%100);
		//思路一:当地址冲突时,采用开放地址法处理冲突
		while(arr[a].key != null){
			a++;
		}
		arr[a] = my;
		/*思路二:当地址冲突时,采用链表法处理冲突-->这也是Java采用的设计思想,
		数组加链表(即每个数组元素里面放一个链表)*/
		//第一步:申请一个每个元素是链表的数组
		MapLinkedList[] map = new MapLinkedList[999];
		//第二步:添加元素
		if(map[a] == null){
			MapLinkedList list = new MapLinkedList();
			list.add(e);
			map[a] = list;
		}else{
			map[a].add(e);
		}
	}
	
	public Object get(Object key){
		int a = (key.hashCode()%100);
		return arr[a].value;
	}
}

class MyEntry{
	Object key;
	Object value;
	public MyEntry(Object key, Object value) {
		super();
		this.key = key;
		this.value = value;
	}
	
}



内容还会继续更新,敬请关注!
发布了69 篇原创文章 · 获赞 2 · 访问量 6万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章