一鼓拧、Hash
二、HashMap
特點(diǎn):
1越妈、HashMap允許使用null季俩,而HashTable不能
2、HashMap是非同步梅掠,而HashTable不是
3酌住、HashMap存儲的是鍵值對。
工作原理:
HashMap基于hashing原理阎抒,我們通過put()和get()方法儲存和獲取對象酪我。當(dāng)我們將鍵值對傳遞給put()方法時,它調(diào)用鍵對象的hashCode()方法來計(jì)算hashcode且叁,讓后找到bucket位置來儲存值對象祭示。當(dāng)獲取對象時,通過鍵對象的equals()方法找到正確的鍵值對,然后返回值對象质涛。HashMap使用鏈表來解決碰撞問題稠歉,當(dāng)發(fā)生碰撞了,對象將會儲存在鏈表的下一個節(jié)點(diǎn)中汇陆。 HashMap在每個鏈表節(jié)點(diǎn)中儲存鍵值對對象怒炸。
當(dāng)兩個不同的鍵對象的hashcode相同時會發(fā)生什么? 它們會儲存在同一個bucket位置的鏈表中毡代。鍵對象的equals()方法用來找到鍵值對阅羹。
三、HashMap和HashTable區(qū)別
? ? 參考:http://www.importnew.com/7010.html
HashMap幾乎可以等價于Hashtable教寂,除了HashMap是非synchronized的捏鱼,并可以接受null(HashMap可以接受為null的鍵值(key)和值(value),而Hashtable則不行)酪耕。
HashMap是非synchronized导梆,而Hashtable是synchronized,這意味著Hashtable是線程安全的迂烁,多個線程可以共享一個Hashtable看尼;而如果沒有正確的同步的話,多個線程是不能共享HashMap的盟步。Java 5提供了ConcurrentHashMap藏斩,它是HashTable的替代,比HashTable的擴(kuò)展性更好却盘。
另一個區(qū)別是HashMap的迭代器(Iterator)是fail-fast迭代器狰域,而Hashtable的enumerator迭代器不是fail-fast的。所以當(dāng)有其它線程改變了HashMap的結(jié)構(gòu)(增加或者移除元素)黄橘,將會拋出ConcurrentModificationException兆览,但迭代器本身的remove()方法移除元素則不會拋出ConcurrentModificationException異常。但這并不是一個一定發(fā)生的行為旬陡,要看JVM拓颓。這條同樣也是Enumeration和Iterator的區(qū)別。
由于Hashtable是線程安全的也是synchronized描孟,所以在單線程環(huán)境下它比HashMap要慢驶睦。如果你不需要同步,只需要單一線程匿醒,那么使用HashMap性能要好過Hashtable场航。
HashMap不能保證隨著時間的推移Map中的元素次序是不變的。