概述:
集合体系中双列集合的顶层接口,定义了双列集合的共性功能和遍历方式。
双列集合每个位置存放的是一对数据,这对数据就拥有了映射关系
Map是一个接口,学习的功能使用实现类使用HashMap来学习
HashMap是典型的Map的实现类,学完Map的功能想当于学完了HashMap
特点:
1、存放的是键值对数据
2、无序集合
3、键要唯一
对应关系
映射:一对一的关系
键值对数据:
键:必须保证唯一【一个Map只能有一个键】
值:可以重复【一个map中可以出现多个相同值】
一般使用键来找值
代码示例
import java.util.HashMap;
import java.util.Map;
public class MapDemo {
public static void main(String[] args) {
//创建Map对象
Map<Integer, String> map = new HashMap<Integer, String>();
//向集合中添加元素
map.put(1, "张三");
map.put(2, "李四");
map.put(3, "王五");
map.put(4, "赵六");
//打印集合
System.out.println(map); //{1=张三, 2=李四, 3=王五, 4=赵六}
}
}
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集合值中是否包含指定的元素
代码示例
import java.util.HashMap;
import java.util.Map;
public class MapDemo {
public static void main(String[] args) {
//创建Map对象
Map<Integer, String> map = new HashMap<Integer, String>();
//向集合中添加元素
map.put(1, "张三");
map.put(2, "李四");
map.put(3, "王五");
map.put(4, "赵六");
//打印集合
System.out.println(map); //{1=张三, 2=李四, 3=王五, 4=赵六}
//修改指定键的值
map.put(2,"Tom");
System.out.println(map); //{1=张三, 2=Tom, 3=王五, 4=赵六}
//删除指定键的键值对数据
map.remove(2);
System.out.println(map); //{1=张三, 3=王五, 4=赵六}
//获取当前集合的长度
System.out.println(map.size()); //3
//获取指定键的对应值
System.out.println(map.get(3)); //王五
//判断map集合键中是否包含指定的元素
boolean boo = map.containsKey(3);
System.out.println(boo); //true
//判断map集合值中是否含有指定的元素
System.out.println(map.containsValue("李四")); //false
}
}
Map的遍历方式:
概述:
Map集合不能直接遍历,只能把双列集合转变为单列集合进行遍历
方式:
一、键找值
二、键值对
一、键找值方式:( keySet() )
1、想办法找到map集合的所有的键
map集合提供keySet方法,得到map集合的所有键的set集合
2、根据单个的键找对应值
遍历键所在的set集合 过程中通过单个的键找到对应单个值
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class MapLoopDemo2 {
public static void main(String[] args) {
//创建集合
Map<Integer, String> map = new HashMap<Integer, String>();
//向集合中添加元素
map.put(1, "一");
map.put(2, "二");
map.put(3, "三");
map.put(4, "四");
map.put(5, "五");
//遍历集合
//获取集合的所有key值
Set<Integer> keySet = map.keySet();
//遍历所有kay值,并用get()获取每个键对应的值
for (Integer integer : keySet) {
System.out.print(map.get(integer) + " "); //一 二 三 四 五
}
}
}
二、键值对方式 : ( entrySet() )
1、把map集合中的键值对数据封装到内部接口对象的属性key和value中,形成一个个键值对对象【把键值对数据变为一个一个键值对对象】
map集合提供一个功能:entrySet(),调用该功能可以得到封装后所有的Entry【键值对】对象所在的Set集合
2、遍历set集合得到每一个键值对对象
3、通过对象的getKey和getValue方法得到对应的键和值
代码示例
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
public class MapLoopDemo2 {
public static void main(String[] args) {
//创建集合
Map<Integer, String> map = new HashMap<Integer, String>();
//向集合中添加元素
map.put(1, "一");
map.put(2, "二");
map.put(3, "三");
map.put(4, "四");
map.put(5, "五");
//获取所有的键值对对象
Set<Entry<Integer, String>> entrySet = map.entrySet();
//遍历键值对对象集合,获取单个键值对对象
for (Entry<Integer, String> entry : entrySet) {
//获取键
Integer k = entry.getKey();
//获取值
String v = entry.getValue();
System.out.println(k + " : " + v);
}
}
}
//输出:
1 : 一
2 : 二
3 : 三
4 : 四
5 : 五
Map 练习
键盘录入一个字符串,统计每个字符出现的次数
例如:录入qwqw!@!@wzs33zh
打印出来:
@出现了2次
q出现了2次
!出现了2次
s出现了1次
3出现了2次
w出现了3次
h出现了1次
z出现了2次
分析:
使用map集合对多个不同元素进行计数
要记录的元素作为key 元素的个数作为value
计数的原理:
遇到元素看一看计数的map的key中有没有这个元素,
没有:把这个元素记录到map集合中
使用put方法添加 【key :元素 value:1】
有:意味着元素再一次出现,修改元素的次数【value】
修改value:
1、把map记录的旧的value取出来加1
2、重新存入map集合
步骤:
1、键盘个字符串
2、创建map集合对象用于计数
3、想办法获取字符串的每一个字符
方式一:遍历字符串
方式二:把字符串变为字符数组
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Scanner;
import java.util.Set;
public class MapScannerDemo {
public static void main(String[] args) {
//创建键盘录入对象
Scanner scanner = new Scanner(System.in);
System.out.println("请输入一个字符串: ");
String str = scanner.nextLine();
equals(str);
}
//定义一个方法,用来判断字符串中,相同的字符有几个
public static void equals(String str) {
//使用map集合用来统计
//创建集合
Map<Character, Integer> map = new HashMap<Character, Integer>();
//把字符串转换为字符数组
char[] charArray = str.toCharArray();
//遍历字符串,并与集合中对比,看集合中是否存在这个元素
for (char c : charArray) {
//存在,则数量加一
if (map.containsKey(c)) {
//根据键,获取旧值的次数
Integer value = map.get(c);
value++; //加一
map.put(c, value); //更新次数
}else {
//如果没有,则添加进集合
map.put(c, 1);
}
}
//遍历集合
Set<Entry<Character, Integer>> entrySet = map.entrySet();
for (Entry<Character, Integer> entry : entrySet) {
//获取键
Character key = entry.getKey();
//获取值
Integer value = entry.getValue();
System.out.println(key + "出现了" + value + "次");
}
}
}
Map 的实现类:
HashMap:
他就是一个典型的Map的实现类没有自己独有的功能和特点,Map集合是什么就是什么。
LinkedHashMap:
是HashMap的子类,功能和HashMap的功能一模一样,但是由无序变为有序
HashMap的key的唯一性
如何保证hashMap的键的唯一性?
要求存放的键的值对应的类必须重写hashCode方法和equals方法
因为HashMap键的存储数据方式和HashSet集合的存储方式是一模一样的。
HashMap和HashSet的关系是?
因为HashSet本身是由HashMap集合构建的,所以唯一性的原理一模 一样
图示