<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;
}
}
內容還會繼續更新,敬請關注!