數組的特點是:尋址容易嚼吞,插入和刪除困難盒件;而鏈表的特點是:尋址困難,插入和刪除容易舱禽。那么我們能不能綜合兩者的特性炒刁,做出一種尋址容易,插入刪除也容易 的數據結構誊稚?答案是肯定的翔始,這就是我們要提起的哈希表
哈希表是根據設定的哈希函數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的方法)進行快速散列查找.