文章目錄
- Map常用方法
- Map遍歷的三種方法
- 先獲取Map集合的全部鍵,再通過遍歷來找值
- Entry對象
- forEach結合lambda表達式
- Map 案例
- 分析需求
- 我的代碼(不好)
- 老師的代碼(好)
- 好在哪里
- 另外
集合分為Collection和Map



Map常用方法
代碼演示
public class MapTest2 {public static void main(String[] args) {// 1.添加元素: 無序,不重復,無索引。Map<String, Integer> map = new HashMap<>();map.put("手表", 100);map.put("手表", 220);map.put("手機", 2);map.put("Java", 2);map.put(null, null);System.out.println(map);// map = {null=null, 手表=220, Java=2, 手機=2}// 2.public int size():獲取集合的大小System.out.println(map.size());// 3、public void clear():清空集合//map.clear();//System.out.println(map);// 4.public boolean isEmpty(): 判斷集合是否為空,為空返回true ,反之!System.out.println(map.isEmpty());// 5.public V get(Object key):根據鍵獲取對應值int v1 = map.get("手表");System.out.println(v1);System.out.println(map.get("手機")); // 2System.out.println(map.get("張三")); // null// 6. public V remove(Object key):根據鍵刪除整個元素(刪除鍵會返回鍵的值)System.out.println(map.remove("手表"));System.out.println(map);// 7.public boolean containsKey(Object key): 判斷是否包含某個鍵 ,包含返回true ,反之System.out.println(map.containsKey("手表")); // falseSystem.out.println(map.containsKey("手機")); // trueSystem.out.println(map.containsKey("java")); // falseSystem.out.println(map.containsKey("Java")); // true// 8.public boolean containsValue(Object value): 判斷是否包含某個值。System.out.println(map.containsValue(2)); // trueSystem.out.println(map.containsValue("2")); // false// 9.public Set<K> keySet(): 獲取Map集合的全部鍵。Set<String> keys = map.keySet();System.out.println(keys);// 10.public Collection<V> values(); 獲取Map集合的全部值。Collection<Integer> values = map.values();System.out.println(values);// 11.把其他Map集合的數據倒入到自己集合中來。(拓展)Map<String, Integer> map1 = new HashMap<>();map1.put("java1", 10);map1.put("java2", 20);Map<String, Integer> map2 = new HashMap<>();map2.put("java3", 10);map2.put("java2", 222);map1.putAll(map2); // putAll:把map2集合中的元素全部倒入一份到map1集合中去。System.out.println(map1);System.out.println(map2);}
}
Map遍歷的三種方法
先獲取Map集合的全部鍵,再通過遍歷來找值
/*** 目標:掌握Map集合的遍歷方式1:鍵找值*/
public class MapTest1 {public static void main(String[] args) {// 準備一個Map集合。Map<String, Double> map = new HashMap<>();map.put("蜘蛛精", 162.5);map.put("蜘蛛精", 169.8);map.put("紫霞", 165.8);map.put("至尊寶", 169.5);map.put("牛魔王", 183.6);System.out.println(map);// map = {蜘蛛精=169.8, 牛魔王=183.6, 至尊寶=169.5, 紫霞=165.8}// 1、獲取Map集合的全部鍵Set<String> keys = map.keySet();// System.out.println(keys);// [蜘蛛精, 牛魔王, 至尊寶, 紫霞]// key// 2、遍歷全部的鍵,根據鍵獲取其對應的值for (String key : keys) {// 根據鍵獲取對應的值double value = map.get(key);System.out.println(key + "=====>" + value);}}
}
Entry對象
- Map集合是用來存儲鍵值對的,而每一個鍵值對實際上是一個Entry對象。
- 這里Map集合的第二種方式,是直接獲取每一個Entry對象,把Entry存儲在Set集合中去,再通過Entry對象獲取鍵和值。
Set 和 Collection是同級
/*** 目標:掌握Map集合的第二種遍歷方式:鍵值對。*/
public class MapTest2 {public static void main(String[] args) {Map<String, Double> map = new HashMap<>();map.put("蜘蛛精", 169.8);map.put("紫霞", 165.8);map.put("至尊寶", 169.5);map.put("牛魔王", 183.6);System.out.println(map);// map = {蜘蛛精=169.8, 牛魔王=183.6, 至尊寶=169.5, 紫霞=165.8}// entries = [(蜘蛛精=169.8), (牛魔王=183.6), (至尊寶=169.5), (紫霞=165.8)]// entry = (蜘蛛精=169.8)// entry = (牛魔王=183.6)// ...// 1、調用Map集合提供entrySet方法,把Map集合轉換成鍵值對類型的Set集合Set<Map.Entry<String, Double>> entries = map.entrySet();for (Map.Entry<String, Double> entry : entries) {String key = entry.getKey();double value = entry.getValue();System.out.println(key + "---->" + value);}}
}
forEach結合lambda表達式
/*** 目標:掌握Map集合的第二種遍歷方式:鍵值對。*/
public class MapTest3 {public static void main(String[] args) {Map<String, Double> map = new HashMap<>();map.put("蜘蛛精", 169.8);map.put("紫霞", 165.8);map.put("至尊寶", 169.5);map.put("牛魔王", 183.6);System.out.println(map);// map = {蜘蛛精=169.8, 牛魔王=183.6, 至尊寶=169.5, 紫霞=165.8}//遍歷map集合,傳遞匿名內部類// 簡化前map.forEach(new BiConsumer<String, Double>() {@Overridepublic void accept(String k, Double v) {System.out.println(k + "---->" + v);}});// 簡化后//遍歷map集合,傳遞Lambda表達式map.forEach(( k, v) -> {System.out.println(k + "---->" + v);});}
}
Lambda表達式
Map 案例
分析需求
- 首先可以將80個學生選擇的景點放到一個集合中去(也就是說,集合中的元素是80個任意的ABCD元素)
- 準備一個Map集合用來存儲景點,以及景點被選擇的次數
- 遍歷80個學生選擇景點的集合,得到每一個景點,判斷Map集合中是否包含該景點
- 如果不包含,則存儲"景點=1"
- 如果包含,則存獲取該景點原先的值,再存儲"景點=原來的值+1"; 此時新值會覆蓋舊值
我的代碼(不好)
public static void main(String[] args){int numA = 0;int numB = 0;int numC = 0;int numD = 0;Random r = new Random();for (int i = 0; i < 80; i++) {int num = r.nextInt(4);switch (num){case 0:numA++;break;case 1:numB++;break;case 2:numC++;break;case 3:numD++;break;}}Map<String,Integer> map = new HashMap<>();map.put("A",numA);//0map.put("B",numB);//1map.put("C",numC);//2map.put("D",numD);//3int sum = numA + numB + numC + numD;System.out.println(sum);System.out.println(map);}
老師的代碼(好)
public static void main(String[] args) {//1. 學生選擇的數據List<String> data = new ArrayList<>();String[] selects = {"A","B","C","D"};Random random = new Random();for (int i = 0; i < 80; i++) {// 每次模擬一個學生選擇一個景點,存入到集合中去。int index = random.nextInt(4); // 0,1,2,3data.add(selects[index]);}//以上,學生數據已經全部收集完畢//2. 使用Map集合統計景點數據Map<String,Integer> result = new HashMap<>();//遍歷data統計數據for(String s : data){if(result.containsKey(s)){result.put(s,result.get(s)+1);}else {result.put(s,1);}}System.out.println(result);}
好在哪里
另外
統計時,map中,不存在直接value++ 這一說,但是能通過覆蓋達到這一效果,(鍵相同值會覆蓋)