Map
概述:
集合体系中双列集合的顶层接口,定义了双列集合的共性功能和遍历方式。双列集合每个位置存放的是一对数据,这对数据的关系为映射。
Map是一个接口,学习的功能使用实现类使用HashMap来学习HashMap是的Map典型的实现类,学完Map的功能相当于学完了HashMap。
特点:
1、存放的是键值对数据
2、无序集合
3、键值唯一
映射:一对一的关系。
键值对数据:
键:必须保证唯一【一个Map的键值对只能有一个键】
值:可以重复【一个map中可以出现多个相同值】一般使用键来找值。
代码示例:
package com.ujiuye.demo;
import java.util.HashMap;
import java.util.Map;
public class HashMapDemo {
public static void main(String[] args) {
Map<String, String> map = new HashMap<String, String>();
map.put("大郎","金莲");
map.put("庆庆","金莲");
map.put("宝宝","蓉蓉");
map.put("喆喆","蓉蓉");
map.put("亮亮","露露");
map.put("平西王","露露");
System.out.println(map);
}
}
Map的常用方法:
1、put(K k,V v):存放键值对的数据到集合【修改指定键的值的功能】
2、remove(K k):删除指定键的键值对数据
3、size():获取map集合的长度【当前调用时】
4、get(K k):获取指定键的对应的值【根据键获取对应的值】
5、containsKey(Object o):判断map集合键中是否包含指定的元素
6、containsValue(Object o):判断map集合值中是否包含指定的元素
代码示例:
package com.ujiuye.demo;
import java.util.HashMap;
import java.util.Map;
public class HashMapDemo {
public static void main(String[] args) {
Map<String, String> map = new HashMap<String, String>();
map.put("大郎","金莲");
map.put("庆庆","金莲");
map.put("宝宝","蓉蓉");
map.put("喆喆","蓉蓉");
map.put("亮亮","露露");
map.put("平西王","露露");
System.out.println(map);
map.put("大郎","王婆");
System.out.println(map);
System.out.println(map.size());// 6
// 删除指定键的键值对数据
map.remove("喆喆");
System.out.println(map);
System.out.println(map.size());// 5
System.out.println(map.get("庆庆"));// 金莲
System.out.println(map.containsKey("涛涛"));// false
System.out.println(map.containsKey("大郎"));// true
System.out.println(map.containsValue("百合"));// false
System.out.println(map.containsValue("六婆"));// false
}
}
Map的遍历方式:
概述:
Map集合不能直接遍历,只能把双列集合转变为单列集合进行遍历
方式:
键找值
键值对
1、键找值方式:
1、想办法找到map集合的所有的键
map集合提供了keySet方法 得到map集合的所有键的set集合
2、根据单个的键找对应值
遍历键所在的set集合 过程中通过单个的键找到对应单个值
代码示例:
package com.ujiuye.demo;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class MapLoopDemo {
public static void main(String[] args) {
Map<String, String> map = new HashMap<String, String>();
map.put("大郎","金莲");
map.put("庆庆","金莲");
map.put("宝宝","蓉蓉");
map.put("喆喆","蓉蓉");
map.put("亮亮","露露");
map.put("平西王","露露");
// 键找值遍历
// 获取map集合所有的key
Set<String> keySet = map.keySet();
// 遍历set集合 通过单个键找到对应的值
for (String key : keySet) {
String value = map.get(key);
System.out.println(key + " : " + value);
}
}
}
2、键值对方式
1、把map集合中的键值对数据封装到内部接口对象的属性key和value中,形成一个个键值对对象【把键值对数据变为一个一个键值对对象】
map集合提供一个功能:entrySet(),调用该功能可以得到封装后所
有的Entry【键值对】对象所在的Set集合2、遍历set集合得到每一个键值对对象
3、通过对象的getKey和getValue方法得到对应的键和值
代码示例
package com.ujiuye.demo;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
public class MapLoopDemo {
public static void main(String[] args) {
Map<String, String> map = new HashMap<String, String>();
map.put("大郎","金莲");
map.put("庆庆","金莲");
map.put("宝宝","蓉蓉");
map.put("喆喆","蓉蓉");
map.put("亮亮","露露");
map.put("平西王","露露");
// 键值对遍历
// 获取所有的键值对对象
Set<Entry<String,String>> entrySet = map.entrySet();
// 遍历键值对对象集合获取单个的键值对对象
for (Entry<String, String> entry : entrySet) {
// 通过对象的getKey和getValue 方法获取键和值
String key = entry.getKey();
String value = entry.getValue();
System.out.println(key + " = " + value);
}
}
}
Map 练习
键盘录入一个字符串,统计每个字符出现的次数
例如:录入
aaaabbccddd!@#@#$@#$%cc66ff
打印出来:a 有 4 个,b 有 2 个,c 有 4 个,d 有 3 个,! 有 1 个,@ 有 3 个,$ 有 2 个,% 有 1 个,6 有 2个,f 有 2 个,
分析:
使用map集合对多个不同元素进行计数,要记录的元素作为key,元素的个数作为value
计数的原理:
遇到元素看一看计数的map的key中有没有这个元素,
没有:把这个元素记录到map集合中
使用put方法添加 【key :元素 value:1】
有:意味着元素再一次出现,修改元素的次数【value】
修改value:
1、把map记录的旧的value取出来加1
2、重新存入map集合
步骤:
1、键盘个字符串
2、创建map集合对象用于计数
3、想办法获取字符串的每一个字符
方式一:遍历字符串
方式二:把字符串变为字符数组
代码示例:
package com.ujiuye.demo;
import java.util.HashMap;
import java.util.Map.Entry;
import java.util.Scanner;
import java.util.Set;
public class MapText {
public static void main(String[] args) {
// 1、键盘录入字符串
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个字符串:");
String str = sc.nextLine();
// 2、创建map集合对象用于计数
HashMap<Character,Integer> map = new HashMap<Character, Integer>();
// 3、想办法获取字符串的每一个字符
// 方式一:遍历字符串
// 方式二:把字符串变为字符数组
char[] cs = str.toCharArray();
// 遍历数组
for (char c : cs) {
// 看一看map集合的key有没有这个字符
if (map.containsKey(c)) {
// 有 更新次数
Integer value = map.get(c);// 获取旧的次数
value++;// 加1
map.put(c, value);// 更新次数
}else {
// 没有 存入map集合
map.put(c, 1);
}
}
// 处理完毕 遍历map集合就可以知道每一个不同字符出现的次数
Set<Entry<Character,Integer>> entrySet = map.entrySet();
for (Entry<Character, Integer> entry : entrySet) {
Character c = entry.getKey();
Integer count = entry.getValue();
System.out.println(c + "出现了" + count + "次,");
}
}
}
Map 的实现类:
HashMap:
它是一个典型的Map的实现类没有自己独有的功能和特点,Map集合是什么它就是什么。
LinkedHashMap:
是HashMap的子类,功能和HashMap的功能一模一样,但是由无序变为有序
HashMap的key的唯一性
如何保证hashMap的键的唯一性?
要求存放的键的值对应的类必须重写hashCode方法和equals方法 因为HashMap键的存储数据方式和HashSet集合的存储方式是一模一
样的。 HashMap和HashSet的关系是?
因为HashSet本身是由HashMap集合构建的,所以唯一性的原理一模 一样