陣列的特點是:定址容易,插入和刪除困難;而鍊錶的特點是:定址困難,插入和刪除容易。
要綜合兩者的特性,就有了雜湊表。雜湊表有多種不同的實現方法,最經典的一種方法 —— 拉鍊法。
雜湊表可以理解為鍊錶的陣列。主幹為陣列,陣列的每乙個成員是鍊錶。該資料結構所容納的所有元素均包含乙個指標,用於元素間的鏈結。我們根據元素的自身特徵把元素分配到不同的鍊錶中去,反過來我們也正是通過這些特徵找到正確的鍊錶,再從鍊錶中找出正確的元素。其中,根據元素特徵計算元素陣列下標的方法就是雜湊演算法。
節點類中需要的屬性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庫 一種簡單的自定義序列號...