一.介紹
Map 是一種把鍵對象和值對象進行關聯(lián)的容器篡撵,而一個值對象又可以是一個Map拴孤,依次類推,這樣就可形成一個多級映射讨便。對于鍵對象來說充甚,像Set一樣,一個 Map容器中的鍵對象不允許重復霸褒,這是為了保持查找結果的一致性;?
如果有兩個鍵對象一樣伴找,那你想得到那個鍵對象所對應的值對象時就有問題了,可能你得到的并不是你想的那個值對象废菱,結果會造成混亂技矮,所以鍵的唯一性很重要,也是符合集合的性質的殊轴。
當然在使用過程中衰倦,某個鍵所對應的值對象可能會發(fā)生變化,這時會按照最后一次修改的值對象與鍵對應旁理。對于值對象則沒有唯一性的要求樊零,你可以將任意多個鍵都映射到一個值對象上,這不會發(fā)生任何問題(不過對你的使用卻可能會造成不便韧拒,你不知道你得到的到底是那一個鍵所對應的值對象)淹接。
二.知識點介紹
1、HashMap
2叛溢、TreeMap
三.上課對應視頻的說明文檔
1、HashMap
HashMap也用到了哈希碼的算法劲适,以便快速查找一個鍵楷掉,它根據鍵的hashCode值存儲數據,大多數情況下可以直接定位到它的值,因而具有很快的訪問速度烹植,但遍歷順序卻是不確定的斑鸦。 HashMap最多只允許一條記錄的鍵為null,允許多條記錄的值為null草雕。HashMap非線程安全巷屿,即任一時刻可以有多個線程同時寫HashMap,可能會導致數據的不一致墩虹。
案例:
public class MapTest {
public static void main(String[] args) {
// Map不同于List嘱巾,它的key不一定是數字
Map map = new HashMap();
map.put("瘋狂Java講義",109);
map.put("瘋狂iOS講義",10);
map.put("瘋狂Ajax講義",79);
// 如果新的value覆蓋了原有的value,該方法返回被覆蓋的value
System.out.println(map.put("瘋狂iOS講義",99)); // 輸出10
System.out.println(map);
// 判斷是否包含指定key
System.out.println("是否包含值為瘋狂iOS講義key:"+map.containsKey("瘋狂iOS講義"));
System.out.println("是否包含值為99 value:"+map.containsValue(99));
// 遍歷map
for (Object key : map.keySet()) {
System.out.println(key+"-->"+map.get(key));
}
}
}
(1) 根據鍵查詢值
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
/*
* Map集合的遍歷诫钓,根據鍵查詢值
*
* 思路:
* A:獲取所有的鍵
* B:遍歷鍵的集合旬昭,獲取得到每一個鍵
* C:根據鍵查詢值
* */
public class IntegerDemo {
public static void main(String[] args) {
// TODO Auto-generated method stub
Map<String, String> map = new HashMap<String, String>();
map.put("hello", "world");
map.put("java", "c++");
map.put("sql", "os");
System.out.println(map);
// A:獲取所有的鍵
Set<String> set = map.keySet();
// B:遍歷鍵的集合,獲取得到每一個鍵
for (String key : set) {
// C:根據鍵查詢值
String value = map.get(key);
System.out.println(key + "---" + value);
}
}
}
(2) 根據鍵值對的對象查詢鍵和值
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
/*
* Map集合的遍歷菌湃,根據對象查詢鍵和值
*
* 思路:
* A:獲取所有的鍵值對對象的集合
* B:遍歷鍵值對對象的集合问拘,得到每一個鍵值對的對象
* C:獲取鍵和值
* */
public class IntegerDemo {
public static void main(String[] args) {
// TODO Auto-generated method stub
Map<String, String> map = new HashMap<String, String>();
map.put("hello", "world");
map.put("java", "c++");
map.put("sql", "os");
System.out.println(map);
// A:獲取所有的鍵值對對象的集合
Set<Map.Entry<String, String>> set = map.entrySet();
// B:遍歷鍵值對對象的集合,得到每一個鍵值對的對象
for (Map.Entry<String, String> me : set) {
// C:獲取鍵和值
String key = me.getKey();
String value = me.getValue();
System.out.println(key + "---" + value);
}
}
}
2惧所、TreeMap
TreeMap則是對鍵按序存放骤坐,因此它便有一些擴展的方法,比如firstKey(),lastKey()等下愈,你還可以從TreeMap中指定一個范圍以取得其子Map纽绍。
鍵和值的關聯(lián)很簡單,用put(Object key,Object value)方法即可將一個鍵與一個值對象相關聯(lián)驰唬。用get(Object key)可得到與此key對象所對應的值對象顶岸。
案例:
public class TestTreeMap
{
public static void main(String[] args)
{
SortedMap<String,String> map=new TreeMap<String,String>();
//插入鍵值對
map.put("bkey","bvalue");
map.put("dkey","dvalue");
map.put("ckey","cvalue");
map.put("akey","avalue");
//獲取鍵值Set
Set<String> keySet=map.keySet();
//將鍵值Set轉成數組
Object[] keyArray=keySet.toArray();
//按照鍵值依序獲取值對象
for(int i=0; i<keyArray.length; i++)
System.out.println( "key="+(String)keyArray[i]+"; value="+map.get((String)keyArray[i]) );
}
}
案例:"aababcabcdabcde",獲取字符串中每一個字母出現(xiàn)的次數要求結果:a(5)b(4)c(3)d(2)e(1)
import java.util.Scanner;
import java.util.Set;
import java.util.TreeMap;
/** 分析:
* A:定義一個字符串(可以改進為鍵盤錄入)
* B:定義一個TreeMap集合
* 鍵:Character
* 值:Integer
* C:把字符串轉換為字符數組
* D:遍歷字符數組,得到每一個字符
* E:拿剛才得到的字符作為鍵到集合中去找值叫编,看返回值
* 是null:說明該鍵不存在辖佣,就把該字符作為鍵,1作為值存儲
* 不是null:說明該鍵存在搓逾,就把值加1卷谈,然后重寫存儲該鍵和值
* F:定義字符串緩沖區(qū)變量
* G:遍歷集合,得到鍵和值霞篡,進行按照要求拼接
* H:把字符串緩沖區(qū)轉換為字符串輸出
*/
public class TreeMapDemo {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("請輸入一個字符串:");
String line = sc.nextLine();
// 定義一個TreeMap集合
//? Character 和Char的區(qū)別世蔗,基本類型和引用類型
TreeMap<Character, Integer> tm = new TreeMap<Character, Integer>();?
//把字符串轉換為字符數組
char[] chs = line.toCharArray();
for(char ch : chs){
//拿剛才得到的字符作為鍵到集合中去找值,看返回值
Integer i =? tm.get(ch);
//是null:說明該鍵不存在朗兵,就把該字符作為鍵污淋,1作為值存儲
if(i == null){
tm.put(ch, 1); // 放入map集合中
}else {? ?
// 不是null:說明該鍵存在,就把值加1余掖,然后重寫存儲該鍵和值
i++;
tm.put(ch,i);
}
}
// 字符串的遍歷和拼接
StringBuilder sb=? new StringBuilder();
//遍歷集合寸爆,得到鍵和值
Set<Character> set = tm.keySet();
for(Character key : set){
Integer value = tm.get(key);
sb.append(key).append("(").append(value).append(")");
}
String result = sb.toString();
System.out.println("result:"+result);
}
}