Map
概括
-
Map是双列集合,双列集合中的每一个元素都是一个键值对。
-
Map<K,V>有两个泛型,K表示键的数据类型,V表示值的数据类型。
Map中的常见方法:
-
(记住)V put(K key, V value):向Map集合中添加键值对元素。在添加时,如果键已经存在,就会使用新的值覆盖掉原来的值。
-
(记住)V get(Object key): 根据键获取对应的值。
-
boolean containsKey(Object key): 判断Map集合中是否包含指定的键。
-
V remove(Object key): 根据键删除整个的键值对, 并返回被删除的值。
tips:
Map是一个接口,如果要用,需要使用实现类,最常用的实现类是HashMap
public class Demo01MapMethod {
public static void main(String[] args) {
//创建Map集合保存数据。 key为整数,value为字符串
Map<Integer, String> map = new HashMap<>();
//V put(K key, V value):向Map集合中添加键值对元素。
map.put(100, "刘德华");
map.put(200, "张学友");
map.put(300, "郭富城");
//输出map集合
System.out.println("map:" + map);//{100=刘德华, 200=张学友, 300=郭富城}
//V get(Object key): 根据键获取对应的值。
System.out.println(map.get(100));//刘德华
System.out.println(map.get(200));//张学友
System.out.println(map.get(10000));//null 如果调用get方法根据键获取值时,该键不存在,得到null值。
//boolean containsKey(Object key): 判断Map集合中是否包含指定的键。
System.out.println("map集合是否包含100这个键:" + map.containsKey(100));
System.out.println("map集合是否包含10000这个键:" + map.containsKey(10000));
//V remove(Object key): 根据键删除整个的键值对, 并返回被删除的值。
//将键为200的键值对元素删除
String value = map.remove(200);
System.out.println("map:" + map);//{100=刘德华, 300=郭富城}
System.out.println("value:" + value);//张学友
System.out.println("===================================================");
//创建Map集合,key是字符串,value也是字符串
Map<String, String> map2 = new HashMap<>();
//向Map集合中添加元素
map2.put("it001", "王宝强");
map2.put("it002", "贾乃亮");
map2.put("it003", "陈羽凡");
//添加元素。 调用put方法添加键值对元素时,如果键已经存在,会使用新的值覆盖掉原来的值。
//map2.put("it003", "大郎");
//输出map2
System.out.println("map2:" + map2);
//put方法返回的是被替换掉的值
//如果调用put方法时,没有产生覆盖效果,那么得到的返回值是null
//如果调用put方法,产生了覆盖效果,那么得到的是被覆盖掉元素的值。
System.out.println(map2.put("it004", "大郎"));//null
System.out.println(map2.put("it004", "金莲"));//大郎
}
}
Map遍历
Map集合不能使用迭代器或者增强for循环去遍历。
- 如果想要遍历Map集合,可以先获取到Map集合中的所有的键,然后把所有的键放入到Set集合。然后遍历Set集合,拿到每一个键, 再根据键获取对应的值。
Map集合中有一个方法叫做keySet,可以获取到所有的键
- Set keySet():获取到所有的键,然后把所有的键放入到Set集合中返回。
keySet
keySet遍历的步骤:
- 调用Map集合的keySet方法,获取到所有的键,并将所有的键放入到一个Set集合中。
- 遍历Set集合,拿到里面的每一个键。
- 调用Map集合的get方法,根据键获取对应的值。
public class Demo02KeySet {
public static void main(String[] args) {
//创建Map集合
Map<String, String> map = new HashMap<>();
//添加元素
map.put("it001", "张三");
map.put("it002", "李四");
map.put("it003", "王叔叔");
//遍历Map集合,依次拿到Map集合中的每一个键和值进行输出。
//1. 调用Map集合的keySet方法,获取到所有的键,并将所有的键放入到一个Set集合中。
Set<String> keys = map.keySet();
//2. 遍历Set集合,拿到里面的每一个键。
for (String key : keys) {
//key表示每一个键
//3. 调用Map集合的get方法,根据键获取对应的值。
String value = map.get(key);
System.out.println(key + "-" + value);
}
}
}
Map集合中保存的元素都两个部分,一个是键,另一个是值。 在Map集合中,一个键对应一个值。
-
在Map集合中,使用了Entry对象保存了这种键值对的对应关系。Map集合中有几个键值对,那么就会有几个Entry对象。
-
Map集合的另一种遍历方式就是通过Entry对象的方式进行遍历的, 我们可以先获取到Map集合中的所有的Entry对象,然后根据Entry对象获取到每一个键和值。
entrySet
Map集合中有一个方法叫做entrySet,可以获取到Map集合中的所有的Entry对象
- Set<Map.Entry<K,V>> entrySet(): 获取到所有的Entry对象并放入到Set集合中返回。
在Entry中有两个方法:
-
K getKey():获取Entry对象中的键
-
V getValue() :获取Entry对象中的值
entrySet的遍历步骤:
- 调用Map集合的entrySet方法,获取到所有的Entry对象并放入到Set集合中。
- 遍历Set集合,拿到里面的每一个Entry对象。
- 调用Entry对象的getKey和getValue获取键和值。
Map集合有两种遍历方式
- keySet遍历(推荐)
- entrySet遍历
public class Demo03EntrySet {
public static void main(String[] args) {
//创建集合
Map<String, String> map = new HashMap<>();
//添加元素
map.put("it001", "张三");
map.put("it002", "李四");
map.put("it003", "王叔叔");
//使用entrySet的方式进行遍历
//1. 调用Map集合的entrySet方法,获取到所有的Entry对象并放入到Set集合中。
Set<Map.Entry<String, String>> entries = map.entrySet();
//2. 遍历Set集合,拿到里面的每一个Entry对象
for (Map.Entry<String, String> entry : entries) {
//3. 调用Entry对象的getKey和getValue获取键和值。
String key = entry.getKey();
String value = entry.getValue();
System.out.println(key + "-" + value);
}
}
}
练习
/*
练习要求: 使用HashMap存储数据,学生对象作为键,家庭住址作为值。
每个学生都有姓名和年龄两个属性,姓名和年龄完全相同,就看成是同一个对象。
HashMap判断唯一性的过程和之前学习的HashSet一模一样(因为HashSet内部就是在使用HashMap保存数据)
1. 先比较两个对象的哈希值
如果哈希值不同,肯定是不同的对象
如果哈希值相同,不一定是同一个对象
2. 如果哈希值相同,还需要使用equals进行比较。
如果equals的结果是true,表示两个对象相同
如果equals的结果是false,表示两个对象不同。
如果要保证HashMap中的key的唯一性(属性相同就看成是同一个对象),那么需要同时重写hashCode和equals
*/
public class Demo04Test {
public static void main(String[] args) {
//创建Map集合,保存数据,学生对象作为键,家庭住址作为值。
Map<Student, String> map = new HashMap<>();
//添加元素
map.put(new Student("杨过", 20), "中国");
map.put(new Student("尹志平", 22), "全真教");
map.put(new Student("小龙女", 24), "古墓");
//添加元素
map.put(new Student("小龙女", 24), "东海龙宫");
//遍历Map集合
//先调用Map集合的keySet方法,获取到所有的键
Set<Student> keys = map.keySet();
//遍历Set集合,获取到每一个键
for (Student key : keys) {
//根据键获取值
String value = map.get(key);
System.out.println(key + "-----------" + value);
}
}
}
LinkedHashMap
LinkedHashMap也是Map接口下的实现类。
- LinkedHashMap内部除了有一个哈希表之外,还有一个链表,链表的作用是保证有序。
public class Demo05LinkedHashMap {
public static void main(String[] args) {
//创建Map集合
Map<String, String> map = new LinkedHashMap<>();
//添加元素
map.put("it001", "张三");
map.put("it002", "李四");
map.put("it003", "王叔叔");
//输出
System.out.println(map);
}
}
练习2
/*
练习要求: 统计一个字符串中每种字符有多少个
举例: 字符串aabbbc a:2 b:3 c:1
思路:
1. 键盘录入一个字符串
2. 定义Map集合,当做计数器,用来统计字符以及出现的次数。 key是字符, value是该字符出现的次数。
3. 遍历字符串,拿到字符串中的每一个字符
4. 判断Map集合中的key是否包含遍历到的字符。
如果包含遍历到的字符,表示之前已经统计过该字符,就获取到该字符出现的次数,把该次数加1,重新放回到Map集合。
如果不包含遍历到的字符,表示之前没有统计过该字符,那么就将字符放入到Map集合,并将次数设置为1.
5. 输出结果
*/
public class Demo06Test {
public static void main(String[] args) {
//1. 键盘录入一个字符串
Scanner sc = new Scanner(System.in);
System.out.println("请您键盘录入一个字符串");
String str = sc.nextLine();
//2. 定义Map集合,当做计数器,用来统计字符以及出现的次数。 key是字符, value是该字符出现的次数。
Map<Character, Integer> map = new HashMap<>();
//3. 遍历字符串,拿到字符串中的每一个字符
for (int i = 0; i < str.length(); i++) {
//ch表示遍历到的字符(也可以看成字符串中的每一个字符)
char ch = str.charAt(i);
//4. 判断Map集合中的key是否包含遍历到的字符。
if(map.containsKey(ch)) {
//如果包含遍历到的字符,表示之前已经统计过该字符,就获取到该字符出现的次数,把该次数加1,重新放回到Map集合。
map.put(ch, map.get(ch) + 1);
} else {
//否则就是Map集合中不包含该字符
//如果不包含遍历到的字符,表示之前没有统计过该字符,那么就将字符放入到Map集合,并将次数设置为1.
map.put(ch, 1);
}
}
//5. 输出结果
//通过Map集合调用keySet方法获取所有的key
Set<Character> keys = map.keySet();
//遍历Set集合,拿到每一个键
for (Character key : keys) {
System.out.println(key + ":" + map.get(key));
}
}
}
来源:https://blog.csdn.net/weixin_45365797/article/details/99285519