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萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章