首頁  >  文章  >  Java  >  Java 中Map 的用法詳解

Java 中Map 的用法詳解

高洛峰
高洛峰原創
2017-01-19 10:40:331394瀏覽

Map簡介

將鍵映射到值的物件。一個映射不能包含重複的鍵;每個鍵最多只能映射到一個值。此介面取代 Dictionary 類,後者完全是抽象類,而不是一個介面。

 Map 介面提供三種collection 視圖,允許以鍵集、值集或鍵-值映射關係集的形式查看某個映射的內容。映射順序 定義為迭代器在映射的 collection 視圖上傳回其元素的順序。某些映射實作可明確保證其順序,如 TreeMap 類別;其他映射實作則不保證順序,如HashMap 類別。

註:將可變物件用作映射鍵時必須格外小心。當物件是映射中某個鍵時,如果以影響 equals 比較的方式更改了物件的值,則映射的行為將是不確定的。此項禁止的一種特殊情況是不允許某個映射將自身作為一個鍵包含。雖然允許某個映射將自身作為值包 含,但請格外小心:在這樣的映射上 equals 和 hashCode 方法的定義將不再是明確的。

Map 介面:

 Map提供key到value的對應。一個Map中不能包含相同的key,每個key只能對應一個value。 Map介面提供3種集合的視圖,Map的內容可以當作一組key集合,一組value集合,或是一組key-value映射。   

 Hashtable類別     

Hashtable繼承Map接口,且實作一個key-value對應的雜湊表。任何非空(non-null)的物件都可作為key或value。    

新增資料使用put(key,  value),取出資料使用get(key),這兩個基本運算的時間開銷為常數。 Hashtable透過initial  capacity和load  factor兩個參數調整效能。通常缺省的load  factor  0.75較好地實現了時間與空間的平衡。增加load  factor可以節省空間但相應的查找時間將增加,這會影響像get和put這樣的操作。

使用Hashtable的簡單示例如下,將1,2,3放到Hashtable中,他們的key分別是”one”,”two”,”three”:  

Hashtable numbers = new Hashtable(); 
numbers.put(“one”, new Integer(1)); 
numbers.put(“two”, new Integer(2)); 
numbers.put(“three”, new Integer(3));

  要一個要數,例如取出一個數,用對應的key:  

Integer n = (Integer)numbers.get(“two”); 
System.out.println(“two = ” + n);

 由於作為key的物件將透過計算其雜湊函數來確定與之對應的value的位置,因此任何作為key的物件都必須實作hashCode和equals方法。 hashCode和equals方法繼承自根類別Object,如果你用自訂的類別當作key的話,要相當小心,按照雜湊函數的定義,如果兩個物件相同,即obj1.equals(obj2)=true,則它們的hashCode必須相同,但如果兩個物件不同,則它們的hashCode不一定不同,如果兩個不同物件的hashCode相同,這種現象稱為衝突,衝突會導致操作雜湊表的時間開銷增大,所以盡量定義好的hashCode()方法,能加快雜湊表的操作。

如果相同的物件有不同的hashCode,對雜湊表的操作會出現意想不到的結果(期待的get方法傳回null),要避免這種問題,只需要牢記一條:要同時複寫equals方法和hashCode方法,而不要只寫其中一個。

 Hashtable是同步的。  

 HashMap類   

HashMap和Hashtable類似,且不同之處在於HashMap是非同步的,並且允許null,即null  value和null  key。 ,但是將HashMap視為Collection時(values()方法可傳回Collection),其迭代子操作時間開銷和HashMap的容量成比例。因此,如果迭代操作的效能相當重要的話,不要將HashMap的初始化容量設得太高,或是load  factor過低。   

 WeakHashMap類   

WeakHashMap是改良的HashMap,而它對key實行“弱引用”,如果一個key不再被外部所引用,那麼該key就可以被GC回收。

 以上就是Java Map介面的介紹,學習java程式設計的同學可以參考下。

更多Java 中Map 的用法詳解相關文章請關注PHP中文網!


陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn