Map
- Map集合称为双列集合,格式:(key1=value1,key2=value2,key3=value3,..,一次需要存一对数据做为一个元素
- Map集合的每个元素“key=value”称为一个键值对/键值对对象/一个Entry对象,Map集合也被叫做“键值对集合“
- Map集合的所有键是不允许重复的,但值可以重复,键和值是一一对应的,每一个键只能找到自己对应的值
HashMap:HashMap集合 --java学习笔记-CSDN博客
LinkedHashMap:LinkedHashMap集合 --java学习笔记-CSDN博客
TreeMap:TreeMap集合 -java学习笔记-CSDN博客
Map集合体系特点
注意:Map系列集合的特点都是由键决定的,值只是一个附属品,值是不做要求的
- HashMap(由键决定特点):无序、不重复、无索引;(用的最多 )
- LinkedHashMap (由键决定特点):由键决定的特点:有序、不重复、无索引
- TreeMap (由键决定特点):按照大小默认升序排序、不重复、无索引
Map集合的常用方法
代码演示:
import java.util.*;
public class MapTest2 {
public static void main(String[] args) {
Map<String,Integer> map1 = new HashMap<>(); //无序,不重复,无索引
map1.put("u盘",25);
map1.put("手表",300);
map1.put("ps5",4800);
map1.put("ps5",4800);
map1.put("团子",77);
map1.put(null,null);
System.out.println(map1); //{null=null, 手表=300, u盘=25, ps5=4800, 团子=77}
//1.public int size():获取集合的大小
int size = map1.size();
System.out.println(size); //5
//2、public void clear():清空集合
map1.clear();
System.out.println(map1); //{}
// 3.public boolean isEmpty(): 判断集合是否为空,为空返回true ,反之!
System.out.println(map1.isEmpty()); //true
map1.put("u盘",25);
map1.put("手表",300);
map1.put("团子",77);
System.out.println(map1.isEmpty()); //false
// 4.public V get(object key): 根据键获取对应值
System.out.println(map1.get("团子")); //77
//5.publicV remove(Object key):根据键删除整个元素(删除键会返回键的值):
System.out.println(map1.remove("u盘")); //25
map1.put("u盘",2);
// 6.public boolean containsKey(0bject key): 判断是否包含某个键 ,包含返回true,反之
System.out.println(map1.containsKey("团子")); //true
System.out.println(map1.containsKey("ps5")); //false
// 7.public boolean containsValue(object value): 判断是否包含某个值。
System.out.println(map1.containsValue(2)); //true
System.out.println(map1.containsValue(4)); //false
//8public Set<K> keySet():获取Map集合的全部键。
Set<String> keys = map1.keySet();
System.out.println(keys); //[手表, u盘, 团子]
// 9.public Collection<V>values();获取Map集合的全部值。
Collection<Integer> values = map1.values();
System.out.println(values); //[300, 2, 77]
//10把其他Map集合的数据倒入到自己集合中来。putALl:把map2集合中的元素全部倒入一份到map1集合中去。
Map<String,Integer> map2 = new HashMap<>();
map2.put("团子",777);
map2.putAll(map1);
System.out.println(map2); //{手表=300, u盘=2, 团子=77} 倒入的数据覆盖老数据
}
}
运行结果:
Map集合的遍历方式
常见遍历方式有三种:
一、键找值方式
1、获取Map集合全部的键
2、遍历全部的键,根据键获取其对应的值
代码演示:
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class MapTest3 {
public static void main(String[] args) {
Map<String,Integer> map1 = new HashMap<>(); //无序,不重复,无索引
map1.put("u盘",25);
map1.put("手表",300);
map1.put("ps5",4800);
map1.put("ps5",4800);
map1.put("团子",77);
map1.put(null,null);
System.out.println(map1); //{null=null, 手表=300, u盘=25, ps5=4800, 团子=77}
//1、获取Map集合全部的键
Set<String> keys = map1.keySet();
//2、遍历全部的键,根据键获取对应的值
for (String key : keys) {
System.out.println(key + "-->" + map1.get(key));
}
}
}
运行结果:
二、键值对方式
- 需要使用到entrySet方法
使用这个方法,会返回一个Map.Entry对象(Map.Entry(key数据类型,value数据类型))集合,每个Entry对象记录一组键值对,遍历这个Map.Entry对象集合,通过Entry提供的getKey和getValue方法即可遍历所有键值对
代码演示:
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class MapTest4 {
public static void main(String[] args) {
Map<String,Integer> map1 = new HashMap<>(); //无序,不重复,无索引
map1.put("u盘",25);
map1.put("手表",300);
map1.put("ps5",4800);
map1.put("ps5",4800);
map1.put("团子",77);
map1.put(null,null);
System.out.println(map1); //{null=null, 手表=300, u盘=25, ps5=4800, 团子=77}
//1、获取Map集合的Map.Entry对象集合
Set<Map.Entry<String,Integer>> entries = map1.entrySet();
//2、遍历Map.Entry对象集合,获取对应的值
for (Map.Entry<String, Integer> entry : entries) {
System.out.println(entry.getKey() + "-->" + entry.getValue());
}
}
}
运行结果:
三、Lambda表达式方式
- 需要用到Map的如下方法:
这个方式就非常简单友好了,一目了然简单易懂
代码演示:
import java.util.HashMap;
import java.util.Map;
public class MapTest5 {
public static void main(String[] args) {
Map<String,Integer> map1 = new HashMap<>(); //无序,不重复,无索引
map1.put("u盘",25);
map1.put("手表",300);
map1.put("ps5",4800);
map1.put("ps5",4800);
map1.put("团子",77);
map1.put(null,null);
System.out.println(map1); //{null=null, 手表=300, u盘=25, ps5=4800, 团子=77}
map1.forEach((k,v) -> {
System.out.println(k + "-->" + v);
});
}
}
运行结果:
Map集合的案例
需求
- 某个班级80名学生,现在需要组织秋游活动,班长提供了四个景点依次是(A、B、C、D),每个学生只能选择一个景点,请统计出最终哪个景点想去的人数最多。
分析
- 将80个学生选择的数据拿到程序中去,[A,A,B,A,B,C,D,….]
- 准备一个Map集合用于存储统计的结果,Map<String,Integer>,键是景点,值代表投票数量
- 遍历80个学生选择的景点,每遍历一个景点,就看Map集合中是否存在该景点,不存在存入“景点=1“存在则其对应值+1,
- 遍历每个景点的票数,记录最大票数的景点
代码:
import java.util.*;
public class MapTest6 {
public static void main(String[] args) {
List<String> data = new ArrayList<>();
String[] select = {"A","B","C","D"};
Random r = new Random();
for (int i = 0; i < 80; i++) {
data.add(select[r.nextInt(4)]);
}
Map<String,Integer> map = new HashMap<>();
for (String datum : data) {
if(map.containsKey(datum)){
map.put(datum,map.get(datum) + 1);
}else{
map.put(datum,1);
}
}
Set<String> keys = map.keySet();
int max = 0;
String scenic_spot = "";
for (String key : keys) {
int value = map.get(key);
if (value > max) {
max = value;
scenic_spot = key;
}
System.out.println(key + ":" + value);
}
System.out.println("最多人选择的景点是" + scenic_spot);
}
}
运行结果: