java映射的概念_Java之路:映射(Map)
在java.util中還增加了映射(Map)。映射是一個存儲關鍵字和值的關聯,或者說是“關鍵字/值”對的對象,即給定一個關鍵字,可以得到它的值。關鍵字和值都是對象,關鍵字必須是唯一的,但是可以存在相同的值。有的映射可以接收null關鍵字和null值,有的則不能。
可以將Map視為偶對象保存接口。Collection每一次只保存一個對象,而Map保存的是一對對象,而且這一對對象一定是按照“Key = Value”的形式保存,也就是說,可以通過Key找到對應的Value,那么這就好比使用電話本一樣: ⑴ Key = 張三,Value = 110; ⑵ Key = 李四,Value = 120; 如果說現在要想找到張三的電話,那么首先應該通過張三這個Key,然后找到其對應的Value——110,如果現在保存的數據之中沒有對應的Key,那么就返回null。
下表給出了支持映射的接口:
一、Map 接口
Map接口映射唯一關鍵字到值。關鍵字(key)是以后用于檢索值的對象。給定一個關鍵字和一個值,可以存儲這個值到一個Map對象中。當這個值被存儲以后,就可以使用它的關鍵字來檢索它。
Map的方法總結在下表中:
注意事項
(1)當調用的映射中沒有項存在時,其中的幾種方法會引發一個NoSuchElementException異常。 (2)當對象與映射中的元素不兼容時,則會引發一個ClassCastException異常。 (3)如果試圖使用映射不允許使用的null對象,則會引發一個NullPointerException異常。 (4)當試圖改變一個不允許修改的映射時,則會引發一個UnsupportedOperationException異常。
映射不是類集,但可以獲得映射的類集“視圖”。為了實現這種功能,可以使用entrySet( )方法,它返回一個包含了映射中元素的集合(Set)。為了得到關鍵字的類集“視圖”,可以使用keySet( )方法。為了得到值的類集“視圖”,可以使用values()方法。類集“視圖”是將映射集成到類集框架內的手段。
二、SortedMap 接口
SortedMap接口擴展了Map,它確保了各項按關鍵字升序排序。
由SortedMap說明的方法總結在下表中:
注意事項
(1)當調用映射中沒有的項時,其中的幾種方法將引發一個NoSuchElementException異常。 (2)當對象與映射中的元素不兼容時,則會引發一個ClassCastException異常。 (3)當試圖使用映射不允許使用的null對象時,則會引發一個nullPointerException異常。
三、Map.Entry 接口
Map.Entry接口使得可以操作映射的輸入。
如由Map接口說明的entrySet( )方法,調用該方法可返回一個包含映射輸入的集合(Set),這些集合元素的每一個都是一個Map.Entry對象。
下表總結了由該接口說明的方法:
四、映射類
AbstractMap對3個具體的映射實現來說,是一個超類。AbstractMap的另一個子類——WeakHashMap實現一個使用“弱關鍵字”的映射,它允許映射中的元素,當該映射的關鍵字不再被使用時,被放入回收站。
1、HashMap 類
HashMap類使用散列表實現Map接口,它是Map接口中最為常用的子類。
HashMap允許一些基本操作,如get( )和put( )的運行時間保持恒定,即便對大型的集合也是這樣的。下面的構造方法定義為:
(1)HashMap( ) :構造一個默認的散列映射。 (2)HashMap(Map m) :用m的元素初始化散列映射。 (3)HashMap(int capacity) :將散列映射的容量初始化為capacity。 (4)HashMap(int capacity, float fillRatio) :用它的參數同時初始化散列映射的容量和填充比。
填充比(也稱為加載容量)? 填充比必須介于0.0與1.0之間,它決定在散列集合向上調整大小之前,有多少空間被充滿。具體來說,就是當元素的個數大于散列集合容量乘以它的填充比時,散列集合將被擴大。對于沒有獲得填充比的構造方法,默認為0.75。
HashMap實現Map并擴展AbstractMap。 它本身并沒有增加任何新的方法。應該注意的是:散列映射并不保證它的元素的順序。 因此,元素加入散列映射的順序并不一定是它們被迭代方法讀出的順序。
package com.xy.test3;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.Map.Entry;
public class HashMapDemo1 {
public static void main(String[] args) {
// 創建HashMap對象
HashMap hm = new HashMap();
// 加入元素到HashMap中
hm.put("John Doe", new Double(3434.34));
hm.put("Tom Smith", new Double(123.22));
hm.put("Jane Baker", new Double(1378.00));
hm.put("Todd Hall", new Double(99.22));
hm.put("Ralph Smith", new Double(-19.08));
// 返回包含映射中項的集合
Set> set = hm.entrySet();
// 用Iterator得到HashMap中的內容
Iterator> itr = set.iterator();
// 顯示元素
while(itr.hasNext()) {
// Map.Entry可以操作映射的輸入
/* 如果用Map來取值,其過程是先從Map中取得關鍵字之后,
* 再返回到Map中取得相對的值
* 而用Map.Entry,可以一次性地得到所有Map中的信息
*/
Map.Entry me = (Map.Entry)itr.next();
System.out.println(me.getKey() + " : " + me.getValue());
}
System.out.println();
// 讓John Doe中的值增加1000
double balance = (Double)hm.get("John Doe").doubleValue();
// 用新值替換掉舊值
hm.put("John Doe", new Double(balance + 1000));
System.out.println("John Doe現在的資金: " + hm.get("John Doe"));
}
}
【結果】
2、TreeMap 類
TreeMap類是基于紅黑樹(Red-Black tree)實現Map接口。TreeMap提供了按排序順序存儲關鍵字/值對的有效手段,同時允許快速檢索。應該注意的是,不像散列映射,樹映射保證它的元素按照關鍵字升序排序。
下面的TreeMap構造方法定義為:
(1)TreeMap( ) :構造一個空的樹映射,該映射使用其關鍵字的自然順序來排序。 (2)TreeMap(Comparator comp) :構造一個空的基于樹的映射,該映射通過使用Comparator comp來排序。 (3)TreeMap(Map m) :用從m的輸入初始化樹映射,該映射使用關鍵字的自然順序來排序。 (4)TreeMap(SortedMap sm) :用從sm的輸入來初始化一個樹映射,該映射將按與sm相同的順序來排序。
TreeMap實現SortedMap并且擴展AbstractMap,而它本身并沒有另外定義其他的方法。
package com.xy.map;
import java.util.Collection;
import java.util.Iterator;
import java.util.TreeMap;
public class TreeMapDemo1 {
public static void main(String[] args) {
// 創建TreeMap對象
TreeMap tm = new TreeMap();
// 加入元素到TreeMap中
tm.put(10000-2000, "小紅");
tm.put(10000-1500, "小四");
tm.put(10000-2500, "小明");
tm.put(10000-5000, "小光");
Collection col = tm.values();
Iterator itr = col.iterator();
System.out.println("工資由低到高:");
while(itr.hasNext()) {
System.out.println(itr.next());
}
}
}
【結果】
3、比較方法
TreeSet和TreeMap都按排序順序存儲元素。然而,更為“個性化”的排序順序則需使用特定的比較方法。
通常在默認的情況下,這些類通過使用被Java稱之為“自然順序”的順序存儲它們的元素,而這種順序通常也是你所需要的(A在B的前面,1在2的前面,等等)。如果需要用不同的方法對元素進行排序,可以在構造集合或映射時,指定一個Comparator對象(詳細請參見第七部分比較器)。這樣做為開發者提供了一種精確控制如何將元素儲存到排序類集和映射中的能力。
下面是一個說明定制的比較方法能力的例子。該例子實現compare( )方法以便它按照正常順序的逆向進行操作。因此,它使得一個樹集合按逆向的順序進行存儲。
package com.xy.compare;
import java.util.Comparator;
import java.util.Iterator;
import java.util.TreeSet;
class MyComp implements Comparator {
public int compare(Object obj1, Object obj2) {
String aStr, bStr;
aStr = (String)obj1;
bStr = (String)obj2;
return bStr.compareTo(aStr);? ? // 注意是bStr調用的,不是aStr
}
}
public class ComparatorDemo2 {
public static void main(String[] args) {
// 創建一個TreeSet對象
TreeSet ts = new TreeSet(new MyComp());
// 向TreeSet對象中加入內容
ts.add("C");
ts.add("A");
ts.add("B");
ts.add("E");
ts.add("F");
ts.add("D");
// 得到Iterator的實例化對象
Iterator itr = ts.iterator();
// 顯示全部內容
while(itr.hasNext()) {
Object element = itr.next();
System.out.print(element + " ");
}
}
}
【結果】? 仔細觀察實現Comparator并覆寫compare()方法的MyComp類(正如前面所解釋的那樣,覆寫equals( )方法既不是必需的,也不是常用的)。 在compare( )方法內部,String方法compareTo( )比較兩個字符串。然而由bStr而不是aStr調用compareTo( )方法,會導致比較的結果被逆向。
對應一個更實際的例子:下面是用TreeMap程序實現存儲賬目資產平衡表例子的程序。下面的程序按姓對賬目進行排序。為了實現這種功能,程序使用了比較方法來比較每一個賬目下姓的先后順序,得到的映射是按姓進行排序的。
package com.xy.compare;
import java.util.Comparator;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import java.util.TreeMap;
class Employee implements Comparator {
public int compare(Object obj1, Object obj2) {
int k;
String aStr, bStr;
aStr = (String)obj1;
bStr = (String)obj2;
k = aStr.compareTo(bStr);
if(k == 0) {? ? // 相等
return aStr.compareTo(bStr);
}
else
return k;
}
}
public class ComparatorDemo3 {
public static void main(String[] args) {
// 創建TreeMap對象
TreeMap tm = new TreeMap(new Employee());
// 加入元素到TreeMap中
tm.put("John Doe", new Double(3434.34));
tm.put("Tom Smith", new Double(123.22));
tm.put("Jane Baker", new Double(1378.00));
tm.put("Todd Hall", new Double(99.22));
tm.put("Ralph Smith", new Double(-19.08));
Set> set = tm.entrySet();
Iterator> itr = set.iterator();
while(itr.hasNext()) {
Map.Entry me = (Map.Entry)itr.next();
System.out.println(me.getKey() + " : " + me.getValue());
}
System.out.println();
// 讓John Doe中的值增加1000
double balance = (Double)tm.get("John Doe").doubleValue();
// 用新值替換掉舊值
tm.put("John Doe", new Double(balance + 1000));
System.out.println("John Doe現在的資金: " + tm.get("John Doe"));
}
}
【結果】
4、Map集合的輸出
在Iterator接口中,我們強調過,若想輸出集合的元素,可直接使用Iterator,那么在之前所有的集合都是Collection接口的子類,并且在Collection接口之中也定義了iterator()方法。但可是Map接口中卻沒有定義iterator()方法,所以現在如果要使用Iterator接口進行Map接口輸出的話,就必須首先清楚Collection和Map接口保存對象的形式上的區別。
(1)Collection中的每一個元素都是一個獨立的對象; (2)Map中的每一個元素都是Key和Value“結伴而行”的組合對象——也就是所謂的“偶對象”。
下面可通過保存圖觀察形式上的區別:
Map.Entry是Map中定義的一個內部接口,而且這個接口是一個使用了static定義的外部接口,在這個接口之中定義了兩個非常重要的方法。 (1)取得對應的Key的方法。public K getKey(); (2)取得對應的Value的方法。public V getValue();
那么清楚了Map.Entry的作用之后,下面就可以采用如下的步驟進行Map的Iterator輸出了: (1)通過Map接口之中entrySet()方法將Map集合變為Set集合,Set之中的泛型類型為Map. Entry; (2)利用Set接口之中的iterator()方法取得Iterator接口對象,此時的泛型類型依然為Map.Entry; (3)利用Iterator迭代出每一個Map.Entry對象,再使用getKey()和getValue()方法取出內容。
package com.xy.map;
import java.util.Map;
import java.util.Set;
import java.util.HashMap;
import java.util.Iterator;
public class IteratorMapDemo1 {
public static void main(String[] args) {
Map map = new HashMap();
map.put(1, "小三");
map.put(2, "小四");
map.put(3, "小五");
Set> set = map.entrySet();
Iterator> itr = set.iterator();
while(itr.hasNext()) {
Map.Entry me = itr.next();
System.out.println(me.getKey() + " : " + me.getValue());
}
}
}
【結果】
總結
以上是生活随笔為你收集整理的java映射的概念_Java之路:映射(Map)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 6个免费科技外文文献下载网址,拿走不谢
- 下一篇: Java:项目整体结构分析