Java簡單實現自定義HashMap

2021-09-10 23:22:33 字數 3239 閱讀 8748

陣列的特點是:定址容易,插入和刪除困難;而鍊錶的特點是:定址困難,插入和刪除容易。

要綜合兩者的特性,就有了雜湊表。雜湊表有多種不同的實現方法,最經典的一種方法 —— 拉鍊法。

雜湊表可以理解為鍊錶的陣列。主幹為陣列,陣列的每乙個成員是鍊錶。該資料結構所容納的所有元素均包含乙個指標,用於元素間的鏈結。我們根據元素的自身特徵把元素分配到不同的鍊錶中去,反過來我們也正是通過這些特徵找到正確的鍊錶,再從鍊錶中找出正確的元素。其中,根據元素特徵計算元素陣列下標的方法就是雜湊演算法

節點類中需要的屬性key,value,指向下乙個節點

節點類

public

class

node

public

node

(object key, object value)

public node getnext()

public

void

setkey

(string s)

public

void

setvalue

(object value)

public object getkey()

public object getvalue()

}

主要實現

hash.hashcode() :返回int型別

hash.put(object key, object value)

hash.get(object key)返回key值對應的value

hash.remove(key) 返回對應的value

hash.replace(key, value) 返回boolean是否remove成功

hash.size() :返回int型別的儲存的節點的個數

hash.containskey(object key) :boolean

hash.containsvalue(value) :boolean

自定義map類

public

class

myhashmap

}/**

* 根據 鍵值對 生成節點 將節點放入雜湊表中

* * @param key

* 鍵

* @param value

* 值

*/public

void

put(object key, object value)

else

number++

; node node =

newnode

(key, value)

;int code =

hashcode

(key.

tostring()

);// 得到雜湊碼

int index =

locate

(code)

;// 得到該雜湊碼在對應雜湊陣列中的位置

// 找到對應位置的煉表頭

linkedlist

list_head = array_head.

get(index)

; list_head.

add(node)

;// 將節點放進鍊錶中}}

/** * 列印雜湊表

*/public

void

show()

} system.out.

println()

;}}/**

* 根據鍵得到值

*/public object getvalue

(object key)

node = node.

getnext()

;}}return null;

}/**

* 移除節點

* * @param key

* @return

*/public

boolean

remove

(object key)

node = node.

getnext()

;}}return

false;}

/** * 替換key鍵處的value值

* * @param key

* @param value

* @return

*/public

boolean

replace

(object key, object value)

}return

false;}

/** * 清空方法

*/public

void

clear()

number =0;

}/**

* 雜湊表中含key鍵,返回true

* * @param key

* @return

*/public

boolean

containskey

(object key)

node = node.

getnext()

;}return

false;}

/** * 雜湊表中含value值,返回true

* * @param value

* @return

*/public

boolean

containsvalue

(object value)

node = node.

getnext()

;}}}

return

false;}

private

void

rehash()

/** * 計算字串的雜湊碼 ascii碼相加

* * @param s

* @return

*/public

inthashcode

(string s)

return k;

}/**

* 得到雜湊碼對應在陣列中的位置

* * @param k

* @return

*/public

intlocate

(int k)

/** * 返回存貯節點的個數

*/public

intsize()

}

Spark 自定義hash函式

之前在spark1.6中執行的 放在了spark2上去執行,發現執行的結果不一致,定位後發現是不同版本中,hash函式的實現方式不同,導致取數結果不同。區別為 spark1.6 版本為hashcode,2.x版本為murmurhash。如果在spark2上執行spark1編寫的 需要重新定義hash...

java 阻塞佇列自定義實現

自定義阻塞佇列 思路 阻塞佇列有這樣乙個特點,當佇列中沒有值得時候,這是只允許值得插入,當佇列中有值得時候,這時候允許佇列的插入,同時也允許佇列中元素的移除,但是當佇列中沒有值得時候,這時候就不允許佇列的移除了,而是等待其他執行緒插入新的元素 public class blockingqueue 如...

java 實現自定義序列號

業務資料主鍵一般情況下通常我們會使用uuid隨機字串,這種字串在未來1000年內應該不會出現第二個。但是在實際開發中,一些業務編號會對使用者直接公開,比如身份證號,電影票號,飛機火車票編號等。這種有著一定規律的業務資料主鍵編號,需要我們通過 來實現。這裡貼上我的github庫 一種簡單的自定義序列號...