Map的繼承關係: Map介面的常用實現類: 1、HashMap、Hashtable(t是小寫) HashMap不是線程安全的,key、value的值都可以是null。 Hashtable是線程安全的,key、value的值都不能是null。 HashMap、Hashtable都是無序的。 如果要使 ...
Map的繼承關係:
Map介面的常用實現類:
1、HashMap、Hashtable(t是小寫)
HashMap不是線程安全的,key、value的值都可以是null。
Hashtable是線程安全的,key、value的值都不能是null。
HashMap、Hashtable都是無序的。
如果要使用自定義的類(未繼承Java自帶的類)作為key,需要重寫自定義類的hashCode()、equals()來保證集合中沒有重覆的key。類名中含hash的集合,都要這樣。
因為不必保證線程安全,所以HaspMap性能比Hashtable略高。
Hashtable是很古老的一個類,命名不規範,問題較多。儘量少用Hashtable。即使要創建線程安全的Map,也儘量不要使用Hashtable,可以使用Collections工具類把HashMap變成線程安全的。
2、LinkedHashMap
LinkedHashMap是HashMap的子類,使用一個雙向鏈表來維護鍵值對的順序(與添加順序相同),維護的是key的順序。
存儲、查找仍是使用hashCode值來索引,遍歷(迭代)才使用鏈表,就是說遍歷時的順序和添加元素的順序相同。
因為內部維護了一個鏈表,所以查找、存儲時HashMap性能高於LinkedHashMap,但遍歷集合時LinkedHashMap性能較好。
3、Properties
Properties是Hashtable的子類,在處理屬性文件時特別方便。Properties的key、value都必須是String。
Properties類的常用方法:
String getProperty(String key)
String getProperty(String key,String defaultValue) key不存在時,把預設的值作為value返回
Object setProperty(String key,String value) 設置屬性值。相當於Hashtable的put()
void load(InputStream is) 從屬性文件(輸入流)中載入鍵值對到Properties對象
void store(OutputStream os,String info) 把properties中的鍵值對寫到輸出流中(一般是屬性文件)。第二個參數是對properties信息的說明。
實例:
1 Properties properties=new Properties(); 2 properties.setProperty("name","張三"); 3 //key、value都必須是String 4 properties.setProperty("age","19"); 5 //輸出鍵值對到屬性文件,一行一個鍵值對。第二個參數是對文件所保存信息的說明,會以註釋形式輸出到屬性文件的首行。a.ini預設在項目的根目錄下。 6 properties.store(new FileOutputStream("a.ini"),"student info"); 7 //properties中仍有鍵值對 8 System.out.println(properties); //{name=張三, age=19}
4、TreeMap
TreeMap類是Map介面的子介面SortedMap的實現類,用紅黑樹來存儲元素,保持集合的有序(並不是添加順序,而是按key的值排列)。
TreeMap的2中排序方式:自然排序(預設)、定製排序。
TreeMap的鍵值對(其實是key)總是處於有序狀態,調用keySet()獲取key的Set,再使用toArray()轉化為數組,這個數組就是有序的。
5、EnumMap
EnumMap的key都必須是同一個枚舉類的實例,元素的排列順序與枚舉類中的順序保持一致。
性能分析:
EnumMap無需維護什麼,性能最好。
TreeMap一般要比HashMap、Hashtable要慢,尤其是添加、刪除鍵值對時,因為內部維護紅黑樹開銷很大。
Hashtable線程安全,所以HashMap性能要高於Hashtable。而Hashtable問題較多,一般不使用。
LinkedHashMap內部要維護一個鏈表,所以HashMap性能一般要高於LinkedHashMap。HashMap底層採用數組存儲鍵值對,查詢效率極高。大量刪除元素、遍歷集合時,LinkedHashMap性能較好。
Properties專門用於操作屬性文件。