Hash 算法凿叠、hashMap、hashTable

數組的特點是:尋址容易嚼吞,插入和刪除困難盒件;而鏈表的特點是:尋址困難,插入和刪除容易舱禽。那么我們能不能綜合兩者的特性炒刁,做出一種尋址容易,插入刪除也容易 的數據結構誊稚?答案是肯定的翔始,這就是我們要提起的哈希表

哈希表是根據設定的哈希函數H(key)和處理沖突方法將一組關鍵字映射到一個有限的地址區(qū)間上,并以關鍵字在地址區(qū)間中的象作為記錄在表中的存儲位置里伯,這種表稱為哈希表或散列城瞎,所得存儲位置稱為哈希地址或散列地址。作為線性數據結構與表格和隊列等相比疾瓮,哈希表無疑是查找速度比較快的一種脖镀。

簡單解釋:哈希(Hash)算法,即散列函數。它是一種單向密碼體制,即它是一個從明文到密文的不可逆的映射,只有加密過程,沒有解密過程狼电。同時,哈希函數可以將任意長度的輸入經過變化以后得到固定長度的輸出蜒灰。哈希函數的這種單向特征和輸出數據長度固定的特征使得它可以生成消息或者數據。

Hashtable和HashMap類有三個重要的不同之處:

1. 第一個不同主要是歷史原因肩碟。Hashtable是基于陳舊的Dictionary類的卷员,HashMap是Java 1.2引進的Map接口的一個實現(xiàn)。

2.Hashtable的方法是同步的腾务,效率低,但是是線程安全的削饵,而HashMap的方法不是同步的岩瘦,非線程安全未巫,但是效率高。這就意味著启昧,雖然你可以不用采取任何特殊的行為就可以在一個多線程的應用程序中用一個Hashtable叙凡,但你必須同樣地為一個HashMap提供外同步。一個方便的方法就是利用Collections類的靜態(tài)的synchronizedMap()方法密末,它創(chuàng)建一個線程安全的Map對象握爷,并把它作為一個封裝的對象來返回。這個對象的方法可以讓你同步訪問潛在的HashMap严里。這么做的結果就是當你不需要同步時新啼,你不能切斷Hashtable中的同步(比如在一個單線程的應用程序中),而且同步增加了很多處理費用刹碾。

(Hashtable是Syncchronize的燥撞,而HashMap是Asyncchronize的,當多個線程訪問Hashtable時迷帜,Hashtable不需要自己為它的方法實現(xiàn)同步物舒;而當多個線程訪問HashMap時,需要通過Collections.synchronizedMap來同步HashMap戏锹。)

什么是線程安全?線程安全是怎么完成的(原理)?

線程安全就是說多線程訪問同一代碼冠胯,不會產生不確定的結果。編寫線程安全的代碼是低依靠線程同步锦针。

首先要明白線程的工作原理荠察,jvm有一個main? memory,而每個線程有自己的working? memory伞插,一個線程對一個variable進行操作時割粮,都要在自己的working? memory里面建立一個copy,操作完之后再寫入main? memory媚污。多個線程同時操作同一個variable舀瓢,就可能會出現(xiàn)不可預知的結果。根據上面的解釋耗美,很容易想出相應的scenario京髓。而用synchronized的關鍵是建立一個monitor,這個monitor可以是要修改的variable也可以其他你認為合適的object比如method商架,然后通過給這個monitor加鎖來實現(xiàn)線程安全堰怨,每個線程在獲得這個鎖之后,要執(zhí)行完? load到workingmemory? ->? use&assign? ->? store到mainmemory? 的過程蛇摸,才會釋放它得到的鎖备图。這樣就實現(xiàn)了所謂的線程安全。

3.HashMap可以讓你將空值作為一個表的條目的key或value,而HashTable不可以揽涮。HashMap中只有一條記錄可以是一個空的key抠藕,但任意數量的條目可以是空的value。這就是說蒋困,如果在表中沒有發(fā)現(xiàn)搜索鍵盾似,或者如果發(fā)現(xiàn)了搜索鍵,但它是一個空的值雪标,那么get()將返回null零院。如果有必要,用containKey()方法來區(qū)別這兩種情況村刨。

一些資料建議告抄,當需要同步時,用Hashtable烹困,反之用HashMap玄妈。但是,因為在需要時髓梅,HashMap可以被同步拟蜻,HashMap的功能比Hashtable的功能更多,而且它不是基于一個陳舊的類的枯饿,所以有人認為酝锅,在各種情況下,HashMap都優(yōu)先于Hashtable奢方。

(另外:Java.util.Properties類是Hashtable的一個子類搔扁,設計用于String keys和values。Properties對象的用法同Hashtable的用法相象蟋字,但是類增加了兩個節(jié)省時間的方法:Store()方法把一個Properties對象的內容以一種可讀的形式保存到一個文件中稿蹲。Load()方法正好相反,用來讀取文件鹊奖,并設定Properties對象來包含keys和values苛聘。注意,因為Properties擴展了Hashtable忠聚,你可以用超類的put()方法來添加不是String對象的keys和values设哗。這是不可取的。另外两蟀,如果你將store()用于一個不包含String對象的Properties對象网梢,store()將失敗。作為put()和get()的替代赂毯,你應該用setProperty()和getProperty()战虏,它們用String參數拣宰。這個類可用于提高HashTable的效率)

List & ArrayList ? Map & HashMap

List是接口,List特性就是有序,會確保以一定的順序保存元素.

ArrayList是它的實現(xiàn)類,是一個用數組實現(xiàn)的List.

Map是接口,Map特性就是根據一個對象查找對象.

HashMap是它的實現(xiàn)類,HashMap用hash表實現(xiàn)的Map,就是利用對象的hashcode(hashcode()是Object的方法)進行快速散列查找.

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末活烙,一起剝皮案震驚了整個濱河市徐裸,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌啸盏,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,997評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件骑祟,死亡現(xiàn)場離奇詭異回懦,居然都是意外死亡,警方通過查閱死者的電腦和手機次企,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評論 3 392
  • 文/潘曉璐 我一進店門怯晕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人缸棵,你說我怎么就攤上這事舟茶。” “怎么了堵第?”我有些...
    開封第一講書人閱讀 163,359評論 0 353
  • 文/不壞的土叔 我叫張陵吧凉,是天一觀的道長。 經常有香客問我踏志,道長阀捅,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,309評論 1 292
  • 正文 為了忘掉前任针余,我火速辦了婚禮饲鄙,結果婚禮上,老公的妹妹穿的比我還像新娘圆雁。我一直安慰自己忍级,他們只是感情好,可當我...
    茶點故事閱讀 67,346評論 6 390
  • 文/花漫 我一把揭開白布伪朽。 她就那樣靜靜地躺著轴咱,像睡著了一般。 火紅的嫁衣襯著肌膚如雪驱负。 梳的紋絲不亂的頭發(fā)上嗦玖,一...
    開封第一講書人閱讀 51,258評論 1 300
  • 那天,我揣著相機與錄音跃脊,去河邊找鬼热押。 笑死,一個胖子當著我的面吹牛盟庞,可吹牛的內容都是我干的经瓷。 我是一名探鬼主播翠储,決...
    沈念sama閱讀 40,122評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼橡疼!你這毒婦竟也來了援所?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 38,970評論 0 275
  • 序言:老撾萬榮一對情侶失蹤欣除,失蹤者是張志新(化名)和其女友劉穎住拭,沒想到半個月后,有當地人在樹林里發(fā)現(xiàn)了一具尸體历帚,經...
    沈念sama閱讀 45,403評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡滔岳,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,596評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了挽牢。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片谱煤。...
    茶點故事閱讀 39,769評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖禽拔,靈堂內的尸體忽然破棺而出刘离,到底是詐尸還是另有隱情,我是刑警寧澤睹栖,帶...
    沈念sama閱讀 35,464評論 5 344
  • 正文 年R本政府宣布硫惕,位于F島的核電站,受9級特大地震影響磨淌,放射性物質發(fā)生泄漏疲憋。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,075評論 3 327
  • 文/蒙蒙 一梁只、第九天 我趴在偏房一處隱蔽的房頂上張望缚柳。 院中可真熱鬧,春花似錦搪锣、人聲如沸秋忙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,705評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽灰追。三九已至,卻和暖如春狗超,著一層夾襖步出監(jiān)牢的瞬間弹澎,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,848評論 1 269
  • 我被黑心中介騙來泰國打工努咐, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留苦蒿,地道東北人。 一個月前我還...
    沈念sama閱讀 47,831評論 2 370
  • 正文 我出身青樓渗稍,卻偏偏與公主長得像佩迟,于是被迫代替她去往敵國和親团滥。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,678評論 2 354

推薦閱讀更多精彩內容

  • 1. Java基礎部分 基礎部分的順序:基本語法报强,類相關的語法灸姊,內部類的語法,繼承相關的語法秉溉,異常的語法力惯,線程的語...
    子非魚_t_閱讀 31,625評論 18 399
  • 原文轉自:http://www.54tianzhisheng.cn/2017/06/10/HashMap-Hash...
    beneke閱讀 3,157評論 1 66
  • Java8張圖 11苍蔬、字符串不變性 12、equals()方法蝴蜓、hashCode()方法的區(qū)別 13碟绑、...
    Miley_MOJIE閱讀 3,701評論 0 11
  • Java SE 基礎: 封裝、繼承茎匠、多態(tài) 封裝: 概念:就是把對象的屬性和操作(或服務)結合為一個獨立的整體格仲,并盡...
    Jayden_Cao閱讀 2,108評論 0 8
  • 沒有華麗,沒有富貴 簡約诵冒,清爽 沒有繁復凯肋,沒有高端 簡單,舒適 一床汽馋,一桌侮东,一椅 一世界 一人,一燈豹芯,一杯 一暖鄉(xiāng)...
    暮雨傾弦閱讀 207評論 4 9