Map接口概述:java
现实生活中,咱们常会看到这样的一种集合:IP地址与主机名,身份证号与我的,系统用户名与系统用户对象等, 这种一一对应的关系,就叫作映射。Java提供了专门的集合类用来存放这种对象关系的对象,即 java.util.Map 接口ide
Map接口与Collection接口的区别:this
Collection 中的集合,元素是孤立存在的(能够理解为单身),向集合中存储元素采用一个个元素的方式存储。 spa
Map 中的集合,元素是成对存在的(能够理解为夫妻)。每一个元素由键与值两部分组成,经过键能够找对所对应的 值。 code
Collection 中的集合称为单列集合, Map 中的集合称为双列集合。 对象
须要注意的是,Map 中的集合不能包含重复的键,值能够重复;每一个键只能对应一个值。blog
Map经常使用子类:接口
HashMap:存储数据采用的哈希表结构,元素的存取顺序不能保证一致。因为要保证键的惟1、不重复,需 要重写键的hashCode()方法、equals()方法。 rem
LinkedHashMap:HashMap下有个子类LinkedHashMap,存储数据采用的哈希表结构+链表结构。经过链 表结构能够保证元素的存取顺序一致;经过哈希表结构能够保证的键的惟1、不重复,须要重写键的 hashCode()方法、equals()方法。get
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 }