</pre><h1>一、Map</h1><p> </p><h2>(一)Map概述</h2><p> </p><p><strong>接口 Map<K,V></strong></p><p align="left"><strong>類型參數:</strong></p><p align="left">K - 此映射所維護的鍵的類型</p><p align="left">V - 映射值的類型</p><p>將鍵映射到值的對象。一個映射不能包含重複的鍵;每個鍵最多隻能映射到一個值。</p><table border="1" cellspacing="0" cellpadding="0" width="100%"><tbody><tr><td colspan="2" style="background:#CCCCFF"><p align="left"><strong>嵌套類摘要</strong></p></td></tr><tr><td valign="top"><p align="right">static interface</p></td><td><p align="left"><strong><a target=_blank href="file:///D:/JDK%20API/api/java/util/Map.Entry.html" title="java.util 中的接口">Map.Entry</a><<a target=_blank href="file:///D:/JDK%20API/api/java/util/Map.Entry.html" title="Map.Entry 中的類型參數">K</a>,<a target=_blank href="file:///D:/JDK%20API/api/java/util/Map.Entry.html" title="Map.Entry 中的類型參數">V</a>></strong> 映射項(鍵-值對)。</p></td></tr></tbody></table><p>Map</p><p> |--Hashtable:底層是哈希表數據結構,不可以存入null鍵null值。該集合是線程同步的。jdk1.0.效率低。</p><p> |--HashMap:底層是哈希表數據結構,允許使用 null 值和 null 鍵,該集合是不同步的。將hashtable替代,jdk1.2.效率高。</p><p> |--TreeMap:底層是二叉樹數據結構。線程不同步。可以用於給map集合中的鍵進行排序。</p><p> </p><p> </p><p>和Set很像。</p><p>其實,Set底層就是使用了Map集合。</p><p> </p><h2>(二)共性方法</h2><p>1,添加。</p><p> put(Kkey, V value) </p><p> putAll(Map<?extends K,? extends V> m) </p><p> </p><p> 2,刪除。</p><p> clear()</p><p> remove(Objectkey) </p><p> </p><p> 3,判斷。</p><p> containsValue(Objectvalue) </p><p> containsKey(Objectkey) </p><p> isEmpty()</p><p> </p><p> </p><p> 4,獲取。</p><p> get(Objectkey) </p><p> size()</p><p> values()</p><p> </p><p> entrySet()</p><p> keySet()</p><p> </p><p> </p><h2>(三)自練</h2><p></p><pre name="code" class="java">import java.util.*;
/*
需求:用Map接口的子類對象演示Map的共性方法
*/
class MapDemo
{
publicstatic void main(String[] args)
{
Map<String,Integer>hm = new HashMap<String,Integer>();
hm.put("zhangsan4",14);
hm.put("zhangsan",11);
hm.put("zhangsan3",13);
hm.put("zhangsan2",12);
hm.put("zhangsan2",16);//兩次輸出鍵重複,之前的數據被覆蓋
sop(hm);
//判斷是否包含鍵或值
sop(hm.containsKey("zhangsan3"));//true
sop(hm.containsValue(33));//false
//獲取
sop(hm.get("zhangsan4"));
//刪除
sop(hm.remove("zhangsan4"));//通過鍵刪除映射關係
sop(hm);
//獲取Map集合中的所有值,並將其返回到Collection對象中
Collection<Integer>coll = hm.values();
sop(coll);
}
publicstatic void sop(Object obj)
{
System.out.println(obj);
}
}
(四)Map集合的兩種取出方式
第一種Set<k>keySet:
將map中所有的鍵存入到Set集合。因爲set具備迭代器。
所有可以迭代方式取出所有的鍵,在根據get方法。獲取每一個鍵對應的值。
import java.util.*;
/*
需求:用Map第一種取出方式keySet取出Map集合中的鍵值
*/
class KeySetDemo
{
publicstatic void main(String[] args)
{
Map<Integer,String>hm = new HashMap<Integer,String>();
hm.put(14,"zhangsan4");
hm.put(11,"zhangsan");
hm.put(13,"zhangsan3");
hm.put(12,"zhangsan2");
hm.put(16,"zhangsan5");
Set<Integer>ks = hm.keySet();
sop(ks);
Iterator<Integer>it = ks.iterator();
while(it.hasNext())
{
Integerkey = it.next();
sop("key:"+ key + " value:" + hm.get(key));
}
}
publicstatic void sop(Object obj)
{
System.out.println(obj);
}
}
Map集合的取出原理:將map集合轉成set集合。在通過迭代器取出。
第二種Set<Map.Entry<k,v>>entrySet:
將map集合中的映射關係存入到了set集合中,而這個關係的數據類型就是:Map.Entry
Entry其實就是Map中的一個static內部接口。
爲什麼要定義在內部呢?
因爲只有有了Map集合,有了鍵值對,纔會有鍵值的映射關係。
關係屬於Map集合中的一個內部事物。
而且該事物在直接訪問Map集合中的元素。
import java.util.*;
/*
需求:使用第二種取出方式取出所有元素
*/
class EntrySetDemo
{
publicstatic void main(String[] args)
{
Map<Integer,String>hm = new HashMap<Integer,String>();
hm.put(14,"zhangsan4");
hm.put(11,"zhangsan");
hm.put(13,"zhangsan3");
hm.put(12,"zhangsan2");
hm.put(16,"zhangsan5");
Set<Map.Entry<Integer,String>>entrySet = hm.entrySet();
Iterator<Map.Entry<Integer,String>>it = entrySet.iterator();
while(it.hasNext())
{
Map.Entry<Integer,String>me = it.next();
Integerkey = me.getKey();
Stringvalue = me.getValue();
sop("key:"+ key + " value:" + value);
}
}
publicstatic void sop(Object obj)
{
System.out.println(obj);
}
}
============================================================
二Hashtable
此類實現一個哈希表,該哈希表將鍵映射到相應的值。任何非 null
對象都可以用作鍵或值。
爲了成功地在哈希表中存儲和獲取對象,用作鍵的對象必須實現 hashCode
方法和 equals
方法。
下面這個示例創建了一個數字的哈希表。它將數字的名稱用作鍵:
Hashtable<String, Integer> numbers
= new Hashtable<String, Integer>();
numbers.put("one", 1);
numbers.put("two", 2);
numbers.put("three", 3);
要獲取一個數字,可以使用以下代碼:
Integer n = numbers.get("two");
if (n != null) {
System.out.println("two = " + n);
}
}