java映射的概念_Java之路:映射(Map)
在java.util中還增加了映射(Map)。映射是一個(gè)存儲(chǔ)關(guān)鍵字和值的關(guān)聯(lián),或者說是“關(guān)鍵字/值”對(duì)的對(duì)象,即給定一個(gè)關(guān)鍵字,可以得到它的值。關(guān)鍵字和值都是對(duì)象,關(guān)鍵字必須是唯一的,但是可以存在相同的值。有的映射可以接收null關(guān)鍵字和null值,有的則不能。
可以將Map視為偶對(duì)象保存接口。Collection每一次只保存一個(gè)對(duì)象,而Map保存的是一對(duì)對(duì)象,而且這一對(duì)對(duì)象一定是按照“Key = Value”的形式保存,也就是說,可以通過Key找到對(duì)應(yīng)的Value,那么這就好比使用電話本一樣: ⑴ Key = 張三,Value = 110; ⑵ Key = 李四,Value = 120; 如果說現(xiàn)在要想找到張三的電話,那么首先應(yīng)該通過張三這個(gè)Key,然后找到其對(duì)應(yīng)的Value——110,如果現(xiàn)在保存的數(shù)據(jù)之中沒有對(duì)應(yīng)的Key,那么就返回null。
下表給出了支持映射的接口:
一、Map 接口
Map接口映射唯一關(guān)鍵字到值。關(guān)鍵字(key)是以后用于檢索值的對(duì)象。給定一個(gè)關(guān)鍵字和一個(gè)值,可以存儲(chǔ)這個(gè)值到一個(gè)Map對(duì)象中。當(dāng)這個(gè)值被存儲(chǔ)以后,就可以使用它的關(guān)鍵字來檢索它。
Map的方法總結(jié)在下表中:
注意事項(xiàng)
(1)當(dāng)調(diào)用的映射中沒有項(xiàng)存在時(shí),其中的幾種方法會(huì)引發(fā)一個(gè)NoSuchElementException異常。 (2)當(dāng)對(duì)象與映射中的元素不兼容時(shí),則會(huì)引發(fā)一個(gè)ClassCastException異常。 (3)如果試圖使用映射不允許使用的null對(duì)象,則會(huì)引發(fā)一個(gè)NullPointerException異常。 (4)當(dāng)試圖改變一個(gè)不允許修改的映射時(shí),則會(huì)引發(fā)一個(gè)UnsupportedOperationException異常。
映射不是類集,但可以獲得映射的類集“視圖”。為了實(shí)現(xiàn)這種功能,可以使用entrySet( )方法,它返回一個(gè)包含了映射中元素的集合(Set)。為了得到關(guān)鍵字的類集“視圖”,可以使用keySet( )方法。為了得到值的類集“視圖”,可以使用values()方法。類集“視圖”是將映射集成到類集框架內(nèi)的手段。
二、SortedMap 接口
SortedMap接口擴(kuò)展了Map,它確保了各項(xiàng)按關(guān)鍵字升序排序。
由SortedMap說明的方法總結(jié)在下表中:
注意事項(xiàng)
(1)當(dāng)調(diào)用映射中沒有的項(xiàng)時(shí),其中的幾種方法將引發(fā)一個(gè)NoSuchElementException異常。 (2)當(dāng)對(duì)象與映射中的元素不兼容時(shí),則會(huì)引發(fā)一個(gè)ClassCastException異常。 (3)當(dāng)試圖使用映射不允許使用的null對(duì)象時(shí),則會(huì)引發(fā)一個(gè)nullPointerException異常。
三、Map.Entry 接口
Map.Entry接口使得可以操作映射的輸入。
如由Map接口說明的entrySet( )方法,調(diào)用該方法可返回一個(gè)包含映射輸入的集合(Set),這些集合元素的每一個(gè)都是一個(gè)Map.Entry對(duì)象。
下表總結(jié)了由該接口說明的方法:
四、映射類
AbstractMap對(duì)3個(gè)具體的映射實(shí)現(xiàn)來說,是一個(gè)超類。AbstractMap的另一個(gè)子類——WeakHashMap實(shí)現(xiàn)一個(gè)使用“弱關(guān)鍵字”的映射,它允許映射中的元素,當(dāng)該映射的關(guān)鍵字不再被使用時(shí),被放入回收站。
1、HashMap 類
HashMap類使用散列表實(shí)現(xiàn)Map接口,它是Map接口中最為常用的子類。
HashMap允許一些基本操作,如get( )和put( )的運(yùn)行時(shí)間保持恒定,即便對(duì)大型的集合也是這樣的。下面的構(gòu)造方法定義為:
(1)HashMap( ) :構(gòu)造一個(gè)默認(rèn)的散列映射。 (2)HashMap(Map m) :用m的元素初始化散列映射。 (3)HashMap(int capacity) :將散列映射的容量初始化為capacity。 (4)HashMap(int capacity, float fillRatio) :用它的參數(shù)同時(shí)初始化散列映射的容量和填充比。
填充比(也稱為加載容量)? 填充比必須介于0.0與1.0之間,它決定在散列集合向上調(diào)整大小之前,有多少空間被充滿。具體來說,就是當(dāng)元素的個(gè)數(shù)大于散列集合容量乘以它的填充比時(shí),散列集合將被擴(kuò)大。對(duì)于沒有獲得填充比的構(gòu)造方法,默認(rèn)為0.75。
HashMap實(shí)現(xiàn)Map并擴(kuò)展AbstractMap。 它本身并沒有增加任何新的方法。應(yīng)該注意的是:散列映射并不保證它的元素的順序。 因此,元素加入散列映射的順序并不一定是它們被迭代方法讀出的順序。
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) {
// 創(chuàng)建HashMap對(duì)象
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));
// 返回包含映射中項(xiàng)的集合
Set> set = hm.entrySet();
// 用Iterator得到HashMap中的內(nèi)容
Iterator> itr = set.iterator();
// 顯示元素
while(itr.hasNext()) {
// Map.Entry可以操作映射的輸入
/* 如果用Map來取值,其過程是先從Map中取得關(guān)鍵字之后,
* 再返回到Map中取得相對(duì)的值
* 而用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現(xiàn)在的資金: " + hm.get("John Doe"));
}
}
【結(jié)果】
2、TreeMap 類
TreeMap類是基于紅黑樹(Red-Black tree)實(shí)現(xiàn)Map接口。TreeMap提供了按排序順序存儲(chǔ)關(guān)鍵字/值對(duì)的有效手段,同時(shí)允許快速檢索。應(yīng)該注意的是,不像散列映射,樹映射保證它的元素按照關(guān)鍵字升序排序。
下面的TreeMap構(gòu)造方法定義為:
(1)TreeMap( ) :構(gòu)造一個(gè)空的樹映射,該映射使用其關(guān)鍵字的自然順序來排序。 (2)TreeMap(Comparator comp) :構(gòu)造一個(gè)空的基于樹的映射,該映射通過使用Comparator comp來排序。 (3)TreeMap(Map m) :用從m的輸入初始化樹映射,該映射使用關(guān)鍵字的自然順序來排序。 (4)TreeMap(SortedMap sm) :用從sm的輸入來初始化一個(gè)樹映射,該映射將按與sm相同的順序來排序。
TreeMap實(shí)現(xiàn)SortedMap并且擴(kuò)展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) {
// 創(chuàng)建TreeMap對(duì)象
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());
}
}
}
【結(jié)果】
3、比較方法
TreeSet和TreeMap都按排序順序存儲(chǔ)元素。然而,更為“個(gè)性化”的排序順序則需使用特定的比較方法。
通常在默認(rèn)的情況下,這些類通過使用被Java稱之為“自然順序”的順序存儲(chǔ)它們的元素,而這種順序通常也是你所需要的(A在B的前面,1在2的前面,等等)。如果需要用不同的方法對(duì)元素進(jìn)行排序,可以在構(gòu)造集合或映射時(shí),指定一個(gè)Comparator對(duì)象(詳細(xì)請(qǐng)參見第七部分比較器)。這樣做為開發(fā)者提供了一種精確控制如何將元素儲(chǔ)存到排序類集和映射中的能力。
下面是一個(gè)說明定制的比較方法能力的例子。該例子實(shí)現(xiàn)compare( )方法以便它按照正常順序的逆向進(jìn)行操作。因此,它使得一個(gè)樹集合按逆向的順序進(jìn)行存儲(chǔ)。
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調(diào)用的,不是aStr
}
}
public class ComparatorDemo2 {
public static void main(String[] args) {
// 創(chuàng)建一個(gè)TreeSet對(duì)象
TreeSet ts = new TreeSet(new MyComp());
// 向TreeSet對(duì)象中加入內(nèi)容
ts.add("C");
ts.add("A");
ts.add("B");
ts.add("E");
ts.add("F");
ts.add("D");
// 得到Iterator的實(shí)例化對(duì)象
Iterator itr = ts.iterator();
// 顯示全部?jī)?nèi)容
while(itr.hasNext()) {
Object element = itr.next();
System.out.print(element + " ");
}
}
}
【結(jié)果】? 仔細(xì)觀察實(shí)現(xiàn)Comparator并覆寫compare()方法的MyComp類(正如前面所解釋的那樣,覆寫equals( )方法既不是必需的,也不是常用的)。 在compare( )方法內(nèi)部,String方法compareTo( )比較兩個(gè)字符串。然而由bStr而不是aStr調(diào)用compareTo( )方法,會(huì)導(dǎo)致比較的結(jié)果被逆向。
對(duì)應(yīng)一個(gè)更實(shí)際的例子:下面是用TreeMap程序?qū)崿F(xiàn)存儲(chǔ)賬目資產(chǎn)平衡表例子的程序。下面的程序按姓對(duì)賬目進(jìn)行排序。為了實(shí)現(xiàn)這種功能,程序使用了比較方法來比較每一個(gè)賬目下姓的先后順序,得到的映射是按姓進(jìn)行排序的。
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) {
// 創(chuàng)建TreeMap對(duì)象
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現(xiàn)在的資金: " + tm.get("John Doe"));
}
}
【結(jié)果】
4、Map集合的輸出
在Iterator接口中,我們強(qiáng)調(diào)過,若想輸出集合的元素,可直接使用Iterator,那么在之前所有的集合都是Collection接口的子類,并且在Collection接口之中也定義了iterator()方法。但可是Map接口中卻沒有定義iterator()方法,所以現(xiàn)在如果要使用Iterator接口進(jìn)行Map接口輸出的話,就必須首先清楚Collection和Map接口保存對(duì)象的形式上的區(qū)別。
(1)Collection中的每一個(gè)元素都是一個(gè)獨(dú)立的對(duì)象; (2)Map中的每一個(gè)元素都是Key和Value“結(jié)伴而行”的組合對(duì)象——也就是所謂的“偶對(duì)象”。
下面可通過保存圖觀察形式上的區(qū)別:
Map.Entry是Map中定義的一個(gè)內(nèi)部接口,而且這個(gè)接口是一個(gè)使用了static定義的外部接口,在這個(gè)接口之中定義了兩個(gè)非常重要的方法。 (1)取得對(duì)應(yīng)的Key的方法。public K getKey(); (2)取得對(duì)應(yīng)的Value的方法。public V getValue();
那么清楚了Map.Entry的作用之后,下面就可以采用如下的步驟進(jìn)行Map的Iterator輸出了: (1)通過Map接口之中entrySet()方法將Map集合變?yōu)镾et集合,Set之中的泛型類型為Map. Entry; (2)利用Set接口之中的iterator()方法取得Iterator接口對(duì)象,此時(shí)的泛型類型依然為Map.Entry; (3)利用Iterator迭代出每一個(gè)Map.Entry對(duì)象,再使用getKey()和getValue()方法取出內(nèi)容。
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());
}
}
}
【結(jié)果】
總結(jié)
以上是生活随笔為你收集整理的java映射的概念_Java之路:映射(Map)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 6个免费科技外文文献下载网址,拿走不谢
- 下一篇: 服务器主板型号详解,支持Intel Xe