1、认识Map集合
·Map集合称为双列集合,格式:(key1=value1,key2=value2,key3=value3,...,一次需要存一对数据做为一个元素
·Map集合的每个元素"key=Value”称为一个键值对/键值对对象/-个Entry对象,Map集合也被叫做“键值对集合”
.Map集合的所有键是不允许重复的,值可以重复,键和值是一一对应的关系,每一个键只能找到自己对应的值。
Map集合在什么业务场景下使用?
需要存储一一对应的数据时,就可以考虑使用Map集合来做。
Map集合体系的特点
注意:Map系列集合的特点都是由键决定的,值只是一个附属品,值是不做要求的
·HashMap(由键决定特点):无序、不重复、无索引; (用的最多)
·LinkedHashMap(由键决定特点):由键决定的特点:有序、不重复、无索引。
. TreeMap(由键决定特点):按照大小默认升序排序、不重复、无索引。
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.TreeMap;
public class Map1 {
public static void main(String[] args) {
//Map<String,Integer> map=new HashMap<>();//一行经典代码,按照键,不重复,无索引,无序
Map<String,Integer> map1=new LinkedHashMap<>();//一行经典代码,按照键,不重复,无索引,有序
Map<Integer,String> map2=new TreeMap<>();//一行经典代码,按照键,不重复,无索引,可排序
map2.put(1,"1");
map2.put(5,"4");
map2.put(2,"6");
map2.put(1,"1");
System.out.println(map2);
map1.put("手表",100);
map1.put("手表",250);//键相同时,后面的数据会覆盖前面的数据
map1.put("手机",666);
map1.put(null,null);
map1.put("电脑",50);
System.out.println(map1);
}
}
为什么要先学习Map的常用方法?
Map是双列集合的祖宗,它的功能是全部双列集合都可以继承过来使用的。
Map的常用方法如下:
方法名称 说明 |
public V put (K key,V value) 添加元素 |
public int size() 获取集合的大小 |
public void clear() 清空集合 |
public boolean isEmpty() 判断集合是否为空,为空返回true,反之 |
public V get(0bject key) 根据键获取对应值 |
public V remove(0bject key) 根据键删除整个元素 |
publicboolean containsKey(Object key) 判断是否包含某个键 |
public boolean containsValue(0bject value) 判断是否包含某个值 |
public Set<K>keySet() 获取全部键的集合 |
public Collection<V>values() 获取Map集合的全部值 |
Map集合的遍历方式
键找值 | 键值对 | Lambda |
01 | 02 | 03 |
先获取Map集合全部的 键,再通过遍历键来找值 | 把"键值对“看成一个整体 进行遍历(难度较大) | JDK1.8开始之后的新技 术(非常的简单) |
键找值:需要用到Map的如下方法
方法名称 | 说明 |
public Set<K>keySet() | 获取所有键的集合 |
public V get(0bject key) | 根据键获取其对应的值 |
Map提供的方法 | 说明 |
Set<Map.Entry<K,V>>entrySet() | 获取所有“键值对”的集合 |
Map.Entry提供的方法 | 说明 |
K getKey() | 获取键 |
V getValue() | 获取值 |
Map集合的遍历方式三:Lambda
需要用到Map的如下方法
方法名称 | 说明 |
default void forEach(BiConsumer<? super K,? super V>action) | 结合lambda遍历Map集合 |
/*
掌握Map集合的遍历方式
①键找值
*/
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.function.BiConsumer;
public class Map2 {
public static void main(String[] args) {
//准备一个Map集合
Map<String,Integer> map1=new HashMap<>();
map1.put("手表",100);
map1.put("手表",250);
map1.put("手机",666);
map1.put(null,null);
map1.put("电脑",50);
Set<String> s= map1.keySet();
System.out.println(s);
//遍历全部的键,再根据键找值
/*
for (String s1 : s) {
System.out.println(map1.get(s1));
}
*/
/*
Set<Map.Entry<String,Integer>> maps=map1.entrySet();
for (Map.Entry<String, Integer> map : maps) {
String key=map.getKey();
Integer value=map.getValue();
System.out.println(key+"--->"+value);
}
//lambda表达式来遍历Map集合
map1.forEach((k,v)->{
System.out.println(k+"->"+v);
});
*/
map1.forEach(new BiConsumer<String, Integer>() {
@Override
public void accept(String s, Integer integer) {
System.out.println(s+"-->"+integer);
}
});
}
}
Map集合的案例--统计投票人数
需求:
*某个班级80名学生,现在需要组织秋游活动,班长提供了4个景点,依次是(A,B,C,D),每个学生只能选择一个景点,请统计出最终哪个景点想去的人数最多。
分析:
①将80个学生选择的数据拿到程序中去,[A,A,B,C,D,B,D,C....]
②准备一个Map集合用于存储统计的结果,Map<String ,Integer>,键是景点,值代表投票的数量。
③遍历80个学生选择的景点,每遍历一个景点,就看Map集合中是否存在该景点,不存在存入“景点=1”,存在则其对应值+1,
import java.util.*;
public class JingDian {
//完成Map集合的案例,统计投票人数
public static void main(String[] args) {
//①将80个学生选择的数据拿到程序中去,[A,A,B,C,D,B,D,C....]
List<String> data=new ArrayList<>();
String [] names={"A","B","C","D"};
Random r=new Random();
for (int i = 0; i < 80; i++) {
//每次模拟一个同学选择一个景点,存入到集合中去
int a=r.nextInt(names.length);
data.add(names[a]);
}
System.out.println(data);
//开始统计每个景点的投票人数
//准备一个Map集合用于统计最终的结果
Map<String,Integer>map=new HashMap<>();
//3、开始遍历80个景点数据
for (String s : data) {
//问问Map集合中是否存在该景点
if (map.containsKey(s)){
//说明这个景点之前统计过,其值+1,存入到Map集合中去
map.put(s,map.get(s)+1);
}else{
//说明这个景点是第一次统计,存入“景点”+1
map.put(s,1);
}
}
System.out.println(map);
}
}