Map是是一種數據結構,它是把數據按照key-value鍵值對的形式保存起來,通常來講,Map的定義是key是獨一無二的,即存在map中的各個鍵必定是不能相同的。固然,對於通常的基本數據類型和String類型,對象都是能夠自動比較的,建議鍵通常用不可變(immutable,能夠參考個人另一篇博文———不可變設計模式)類型。而對於其它的複雜類型,若是你沒有在類中定義equals方法,則map中是能夠存放相同的鍵的,由於它沒法判斷兩個對象是否相同,因此在使用map存儲數據時,鍵的數據類型必定要覆寫equals方法,以提供能夠判斷兩個對象是否相等的方法。 設計模式
Map並非Collection的一部分,即它是一個獨立的接口,並無繼承Collection接口,所以它沒法直接實現迭代器。可是它能夠經過調用方法entrySet獲得一個Set對象,而Set是Collection的一個類,所以Set能夠生成迭代器。另外,Map內部還有一個EntrySet<K,V>接口,這個接口能夠提供獲取鍵-值的方法,很是方便。 安全
HashMap內部是經過一個哈希函數來計算鍵的哈希值,而後內部含有一個數據結構用來存放鍵的哈希值,進而能夠根據它的哈希值來檢索鍵值對的位置。所以,若是你要將數據存進HashMap中,而且鍵的類型是一個自定義的類,該類要覆寫equals方法之外,還要覆寫hashCode()方法,緣由是HashMap是根據鍵的哈希值來存放數據的。通常默認狀況下,Object類的equals方法根據兩個對象是否指向同一個地址而返回真假,hashCode根據不一樣的對象爲賦予不一樣的整數值。 數據結構
除此以外,HashMap中鍵值對的順序是亂序的,即放入的時候的順序會被打亂,取出的時候多是亂序的。 多線程
Hashtable與HashMap基本上一致,使用方法和使用要求均一致,惟一的區別是Hashtable是線程安全的,而HashMap是線程不安全的。所以,若在多線程環境下,最好使用Hashtable來存放鍵值對,而單一線程下就使用HashMap存放鍵值對,由於HashMap的性能比Hashtable優化不少。 函數
LinkedHashMap其實是HashMap的一個子類,所以它繼承自HashMap的許多特性和方法,然而,LinkedHashMap也有本身獨特的地方,那就是它會按照鍵值對插入時的順序取出來,即它是有序的。 性能
TreeMap的內部鍵值對的存儲是有序的,而這個順序是根據鍵的比較來肯定的,所以,若是想要把數據存進TreeMap但願是按照鍵的大小來排序的,若是鍵是自定義類型的,鍵這個類型中必定要實現Comparable接口,進而要實現compareTo方法,否則存放數據時會拋出異常。 優化