Java Map底層實現思路
來源:程序員人生 發布時間:2015-08-24 08:07:04 閱讀次數:3978次
<pre name="code" class="java">package cn.com.commsoft.map;
/**
*
* @author wengle
*Java中規定,兩個內容相同的對象
*(指的是通過調用equals方法返回true的對象),應當具有相等的hashcode
*1、上面的話,相當于equals返回true的兩個對象,就具有相同的hashcode,
*但是具有相同hashcode的對象,通過調用equals方法不1定返回true(Map就是1個例子)
*2、重寫了equals方法,就必須重寫hashcode方法,為了保證上面的Java規定
*/
public class MyMap {
MyEntry[] arr = new MyEntry[100];
int size;
/**
* 采取hash算法實現map,(每一個對象都有1個地址,
* 根據地址生成的1個hash碼,由于每一個對象的地址都不1樣,所以
* 生成的hash碼是唯1的)
* @param key
* @param value
*/
public void put(Object key, Object value){
MyEntry my = new MyEntry(key, value);
//相當于地址映照函數,但是會產生地址映照沖突
int a = (key.hashCode()%100);
//思路1:當地址沖突時,采取開放地址法處理沖突
while(arr[a].key != null){
a++;
}
arr[a] = my;
/*思路2:當地址沖突時,采取鏈表法處理沖突-->這也是Java采取的設計思想,
數組加鏈表(即每一個數組元素里面放1個鏈表)*/
//第1步:申請1個每一個元素是鏈表的數組
MapLinkedList[] map = new MapLinkedList[999];
//第2步:添加元素
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;
}
}
內容還會繼續更新,敬請關注!
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈