Map介面概述: 現實生活中,我們常會看到這樣的一種集合:IP地址與主機名,身份證號與個人,系統用戶名與系統用戶對象等, 這種一一對應的關係,就叫做映射。Java提供了專門的集合類用來存放這種對象關係的對象,即 java.util.Map 介面 Map介面與Collection介面的區別: Coll ...
Map介面概述:
現實生活中,我們常會看到這樣的一種集合:IP地址與主機名,身份證號與個人,系統用戶名與系統用戶對象等, 這種一一對應的關係,就叫做映射。Java提供了專門的集合類用來存放這種對象關係的對象,即 java.util.Map 介面
Map介面與Collection介面的區別:
Collection 中的集合,元素是孤立存在的(可以理解為單身),向集合中存儲元素採用一個個元素的方式存儲。
Map 中的集合,元素是成對存在的(可以理解為夫妻)。每個元素由鍵與值兩部分組成,通過鍵可以找對所對應的 值。
Collection 中的集合稱為單列集合, Map 中的集合稱為雙列集合。
需要註意的是,Map 中的集合不能包含重覆的鍵,值可以重覆;每個鍵只能對應一個值。
Map常用子類:
HashMap:存儲數據採用的哈希表結構,元素的存取順序不能保證一致。由於要保證鍵的唯一、不重覆,需 要重寫鍵的hashCode()方法、equals()方法。
LinkedHashMap:HashMap下有個子類LinkedHashMap,存儲數據採用的哈希表結構+鏈表結構。通過鏈 表結構可以保證元素的存取順序一致;通過哈希表結構可以保證的鍵的唯一、不重覆,需要重寫鍵的 hashCode()方法、equals()方法。
Map介面中的常用方法
Map介面中定義了很多方法,常用的如下:
public V put(K key, V value) : 把指定的鍵與指定的值添加到Map集合中。
public V remove(Object key) : 把指定的鍵 所對應的鍵值對元素 在Map集合中刪除,返回被刪除元素的 值。
public V get(Object key) 根據指定的鍵,在Map集合中獲取對應的值。
public Set<K> keySet() : 獲取Map集合中所有的鍵,存儲到Set集合中。
public Set<Map.Entry<K,V>> entrySet() : 獲取到Map集合中所有的鍵值對對象的集合(Set集合)。
1 package demosummary.map;
2
3 import java.util.HashMap;
4 import java.util.Map;
5 import java.util.Set;
6
7 /**
8 * public V put(K key, V value) : 把指定的鍵與指定的值添加到Map集合中。
9 *
10 * public V get(Object key) 根據指定的鍵,在Map集合中獲取對應的值。
11 *
12 * public V remove(Object key) : 把指定的鍵所對應的鍵值對元素在Map集合中刪除,返回被刪除元素的值。
13 *
14 * public Set<K> keySet() : 獲取Map集合中所有的鍵,存儲到Set集合中。
15 *
16 * public Set<Map.Entry<K,V>> entrySet() : 獲取到Map集合中所有的鍵值對對象的集合(Set集合)。
17 */
18 public class MapMethods {
19 public static void main(String[] args) {
20 /**
21 * public V put(K key, V value) : 把指定的鍵與指定的值添加到Map集合中。
22 */
23 //創建map集合
24 HashMap<String, String> map = new HashMap<>();
25 //添加元素
26 map.put("蠻王", "艾希");
27 map.put("蓋倫", "卡特琳娜");
28 map.put("卡牌", "寡婦");
29 //列印map集合
30 System.out.println(map);//{卡牌=寡婦, 蠻王=艾希, 蓋倫=卡特琳娜}
31
32 /**
33 * public V get(Object key) 根據指定的鍵,在Map集合中獲取對應的值。
34 */
35 String result = map.get("蠻王");
36 System.out.println(result);//艾希
37
38 /**
39 * public V remove(Object key) : 把指定的鍵所對應的鍵值對元素在Map集合中刪除,返回被刪除元素的值。
40 */
41 String result1 = map.remove("蠻王");
42 System.out.println(result1);//艾希
43 System.out.println(map);//{卡牌=寡婦, 蓋倫=卡特琳娜}
44
45 /**
46 * public Set<K> keySet() : 獲取Map集合中所有的鍵,存儲到Set集合中。
47 */
48 Set<String> set = map.keySet();
49 System.out.println(set);//[卡牌, 蓋倫]
50
51 /**
52 * public Set<Map.Entry<K,V>> entrySet() : 獲取到Map集合中所有的鍵值對對象的集合(Set集合)。
53 */
54 Set<Map.Entry<String, String>> set1 = map.entrySet();
55 System.out.println(set1);//[卡牌=寡婦, 蓋倫=卡特琳娜]
56
57 }
58 }
註意:使用put方法時,若指定的鍵(key)在集合中沒有,則沒有這個鍵對應的值,返回null,並把指定的鍵值添加到 集合中;若指定的鍵(key)在集合中存在,則返回值為集合中鍵對應的值(該值為替換前的值),並把指定鍵所對應的值,替換成指定的新值。
Map集合遍歷鍵找值方式
鍵找值方式:即通過元素中的鍵,獲取鍵所對應的值
分析步驟:
1. 獲取Map中所有的鍵,由於鍵是唯一的,所以返回一個Set集合存儲所有的鍵。方法提示: keyset()
2. 遍歷鍵的Set集合,得到每一個鍵。
3. 根據鍵,獲取鍵所對應的值。方法提示: get(K key)
1 package demosummary.map;
2
3 import java.util.HashMap;
4 import java.util.Set;
5
6 public class MapFor {
7 /**
8 * 鍵找值方式:即通過元素中的鍵,獲取鍵所對應的值
9 * 分析步驟:
10 * 1. 獲取Map中所有的鍵,由於鍵是唯一的,所以返回一個Set集合存儲所有的鍵。方法提示: keyset()
11 * 2. 遍歷鍵的Set集合,得到每一個鍵。
12 * 3. 根據鍵,獲取鍵所對應的值。方法提示: get(K key)
13 */
14 public static void main(String[] args) {
15 //創建map集合
16 HashMap<String, String> map = new HashMap<>();
17 //添加元素
18 map.put("蠻王", "艾希");
19 map.put("德瑪", "卡特琳娜");
20 map.put("卡牌", "寡婦");
21 //獲取鍵
22 Set<String> keys = map.keySet();
23 //遍歷鍵
24 for (String key : keys) {
25 //通過鍵獲取值
26 String s = map.get(key);
27 System.out.println(s);
28 /**
29 * 運行結果
30 * 寡婦
31 * 卡特琳娜
32 * 艾希
33 */
34 }
35 }
36 }
Entry鍵值對對象
我們已經知道, Map 中存放的是兩種對象,一種稱為key(鍵),一種稱為value(值),它們在在 Map 中是一一對應關 系,這一對對象又稱做 Map 中的一個 Entry(項) 。 Entry 將鍵值對的對應關係封裝成了對象。即鍵值對對象,這 樣我們在遍歷 Map 集合時,就可以從每一個鍵值對( Entry )對象中獲取對應的鍵與對應的值。
方法:
public K getKey() :獲取Entry對象中的鍵。
public V getValue() :獲取Entry對象中的值。
在Map集合中也提供了獲取所有Entry對象的方法:
public Set<Map.Entry<K,V>> entrySet() : 獲取到Map集合中所有的鍵值對對象的集合(Set集合)。
操作步驟與圖解:
1. 獲取Map集合中,所有的鍵值對(Entry)對象,以Set集合形式返回。方法提示: entrySet() 。
2. 遍歷包含鍵值對(Entry)對象的Set集合,得到每一個鍵值對(Entry)對象
3. 通過鍵值對(Entry)對象,獲取Entry對象中的鍵與值。 方法提示: getkey() getValue()
1 package demosummary.map;
2
3 import java.util.HashMap;
4 import java.util.Map;
5 import java.util.Set;
6
7 public class MapEntry {
8 public static void main(String[] args) {
9 //創建map集合
10 HashMap<String, String> map = new HashMap<>();
11 //添加元素
12 map.put("蠻王", "艾希");
13 map.put("德瑪", "卡特琳娜");
14 map.put("卡牌", "寡婦");
15 //獲取entry對象
16 Set<Map.Entry<String, String>> entrySet = map.entrySet();
17 //遍歷得到entry對象
18 for (Map.Entry<String, String> es : entrySet) {
19 String key = es.getKey();
20 String value = es.getValue();
21 System.out.println(key + "的CP是" + value);
22 /**
23 * 執行結果
24 * 卡牌的CP是寡婦
25 * 德瑪的CP是卡特琳娜
26 * 蠻王的CP是艾希
27 */
28 }
29 }
30 }
HashMap存儲自定義類型鍵值
1 package demosummary.map;
2
3 import java.util.HashMap;
4 import java.util.Objects;
5 import java.util.Set;
6
7 public class MapStudent {
8 private String name;
9 private Integer age;
10
11 public MapStudent() {
12 }
13
14 public MapStudent(String name, Integer age) {
15 this.name = name;
16 this.age = age;
17 }
18
19 public String getName() {
20 return name;
21 }
22
23 public void setName(String name) {
24 this.name = name;
25 }
26
27 public Integer getAge() {
28 return age;
29 }
30
31 public void setAge(Integer age) {
32 this.age = age;
33 }
34
35 @Override
36 public boolean equals(Object o) {
37 if (this == o) return true;
38 if (o == null || getClass() != o.getClass()) return false;
39 MapStudent that = (MapStudent) o;
40 return Objects.equals(name, that.name) &&
41 Objects.equals(age, that.age);
42 }
43
44 @Override
45 public int hashCode() {
46 return Objects.hash(name, age);
47 }
48
49 @Override
50 public String toString() {
51 return "MapStudent{" +
52 "name='" + name + '\'' +
53 ", age=" + age +
54 '}';
55 }
56
57 public static void main(String[] args) {
58 //創建HashMap集合對象
59 HashMap<MapStudent, String> map = new HashMap<>();
60 //添加元素
61 map.put(new MapStudent("A", 20),"北京");
62 map.put(new MapStudent("B", 21),"上海");
63 map.put(new MapStudent("C", 22),"深圳");
64 map.put(new MapStudent("D", 20),"廣州");
65 //獲取keySet對象
66 Set<MapStudent> ms = map.keySet();
67 //遍歷得到的Key
68 for (MapStudent m : ms) {
69 String s = map.get(m);
70 System.out.println(s);
71 }
72 /**
73 * 執行結果
74 * 廣州
75 * 北京
76 * 上海
77 * 深圳
78 */
79 }
80 }
LinkedHashMap
LinkedHashMap可以保證存進去的元素有序,因為在HashMap下麵有一個子類LinkedHashMap,它是鏈表和哈希表組合的一個數據存儲結構
1 package demosummary.map;
2
3 import java.util.LinkedHashMap;
4 import java.util.Map;
5 import java.util.Set;
6
7 public class LinkedMapDemo {
8 public static void main(String[] args) {
9 //創建LinkedHashMap集合
10 LinkedHashMap<String, String> map = new LinkedHashMap<>();
11 //添加元素
12 map.put("蠻王", "艾希");
13 map.put("德瑪", "卡特琳娜");
14 map.put("卡牌", "寡婦");
15 //獲取entrySet對象
16 Set<Map.Entry<String, String>> me = map.entrySet();
17 //遍歷獲取的鍵
18 for (Map.Entry<String, String> sse : me) {
19 System.out.println(sse.getKey()+"=="+sse.getValue());
20 }
21 /**
22 * 執行結果
23 * 蠻王==艾希
24 * 德瑪==卡特琳娜
25 * 卡牌==寡婦
26 */
27 }
28 }