2.7 實現get方法
注資料結構中有陣列和鍊錶來實現對資料的儲存。
hashmap的頂層介面是map,那麼我們自己實現的map也需要乙個介面,在這裡我定義介面的名稱為mymap。這個介面中應該含有的方法包括:
package map;
public
inte***ce
mymap
}
介面設計完畢之後,我們需要建立乙個類來實現這個介面的方法。我建立了乙個名為myhashmap的類實現mymap介面。
這裡我們需要乙個內部類來實現mymap的內部介面,內部類的例項物件即陣列中儲存的entry物件,所以我們需要定義三個成員變數,分別是k,v和next。next的型別就是entry本身,因為它指向的是下乙個entry物件。
內部類**:
public
class
myhashmap
implements
mymap
@override
public k getkey()
@override
public v getvalue()
}}
hashmap中含有以下幾個成員變數:
//預設陣列大小,初始大小為16
private
static
int defaultlength =16;
//預設負載因子,為0.75
private
static
double defaultloader =
0.75
;//entry陣列
private entry
table = null;
//hashmap的大小
private
int size =
0;
在hashmap中預設陣列長度和預設負載因子都是可以自定義的,那麼我們定義乙個可以自定義陣列長度和負載因子的構造方法。
自定義長度和負載因子:
public
myhashmap
(int length,
double loader)
預設:
public
myhashmap()
雜湊函式我們使用除留取餘法。定義乙個整型m,m的取值應該是乙個比陣列長度小的最大質數,為了簡化演算法我取陣列的長度作為m的值。以key的雜湊值模於m,得到index的值並且返回。
本例為了方便理解簡單舉例,如果需要分布更均勻些,請自己寫。
/**
* 自定義雜湊演算法:根據key的雜湊值得到乙個index索引
* 即存放到陣列中的下標
* * @param k
* @return
*/private
intgetindex
(k k)
我們需要通過雜湊演算法得到陣列的下標,然後把乙個包含鍵值對以及next指標的entry物件存到該位置中。
@override
public v put
(k k, v v)
// 根據key和雜湊演算法算出陣列下標
int index =
getindex
(k);
system.out.
println
("下標為:"
+ index)
; entry
entry = table[index];if
("key30"
.equals
(k))
// 判斷entry是否為空
if(entry == null)
else
return table[index]
.getvalue()
;}
當陣列大小已經超過負載的時候,需要對進行擴容,擴容後還需要將原先的值重新排列,以確保值分布均勻。此處重新雜湊我們借助了集合來實現。
/**
* 陣列擴容
*/private
void
expand()
// 重新雜湊的過程
private
void
rehash
(entry
newtable)
// 通過遞迴的方式將所有的entry物件裝載到list中
findentrybynext
(table[i]
, list);}
table = newtable;
if(list.
size()
>0)
// 對新table進行雜湊
put(entry.
getkey()
, entry.
getvalue()
);}}
system.out.
println
("重新雜湊完成*****");
}private
void
findentrybynext
(entry
entry, list
> list)
else
}
get方法先去獲取雜湊值,而後再根據得到得位置來遍歷鍊錶,以確保找到key。
@override
public v get
(k k)
// 呼叫方法找到真正的value值並返回。
return
findvaluebyequalkey
(k, table[index]);
}
/**
* * 通過遞迴比較key值的方式找到真正我們要找的value值
* * @param k
* @param entry
* @return
*/private v findvaluebyequalkey
(k k, entry
entry)
else
}return entry.
getvalue()
;}
自己動手實現乙個hashmap
動手實現 redux
假如按鈕和介面不在同一元件,經常用redux去實現上面功能,可以想象到如下 const test hello world const mapstatetoprops state 用過mapstatetoprops從頂層拿到屬性然後展示,在另乙個組建通過mapdispatchtoprops去觸發act...
動手實現Tomcat
版本一 無區分靜態資源 如demo.html 一 需求描述 二 整體示意圖 三 實現 專案工程 服務端的工作都在testserver類中完成 1.服務端的準備工作 1 靜態變數web root,用於存放webcontent目錄的絕對路徑 2 定義靜態變數url,存放本次請求服務端的靜態資源的名稱 2...
hashmap實現機制
int uint key.gethashcode 0x8ffffff 具體多少忘記了,總之就是把它弄成正數 int index uint map.length 把value放到那個 index位置。下次訪問時再通過 key的hashcode 0x8fffff 再 map.length 就知道valu...