Map集合体系
Map集合体系
一、Map集合的概述
(1)Map集合概述和使用
●Map集合是一种双列集合,每个元素包含两个数据。
●Map集合的每个元素的格式:key=value(键值对元素)。
●Map集合也被称为”键值对集合“
●键和值一一对应,一个键对应一个值,整个集合的特点是由键决定的
(2)Map集合整体格式
●Collection集合的格式: [元素1,元素2,元素3…]
●Map集合的完整格式: {key1=value1 , key2=value2 , key3=value3 …}
(3)Map集合的使用场景之一:购物车系统
分析:
●购物车提供的每个商品和购买的数量在后台需要容器存储。
●每个商品对象都一一对应一个购买数量。
●把商品对象看成是Map集合的建,购买数量看成Map集合的值。
●{商品1=2,商品2=3,商品3=2 ,商品4=3}
(4)总结
Map集合是什么?使用场景是什么样的?
●Map集合是键值对集合
●Map集合非常适合做类购物车这样的业务场景。
二、Map集合特点
说明:
●使用最多的Map集合是HashMap。
●重点掌握HashMap ,LinkedHashMap , TreeMap。
(1)Map集合体系特点
●Map集合的特点都是由键决定的。
●Map集合的键是无序,不重复的,无索引的,值不做要求(可以重复)。
●Map集合后面重复的键对应的值会覆盖前面重复键的值。
●Map集合的键值对都可以为null。
(2)Map集合实现类特点
①HashMap:
元素按照键是无序,不重复,无索引,值不做要求。(与Map体系一致)
②LinkedHashMap
元素按照键是有序,不重复,无索引,值不做要求。
③TreeMap
元素按照建是排序,不重复,无索引的,值不做要求。
三、Map集合常用API
(1)Map集合API如下
●Map是双列集合的祖宗接口,它的功能是全部双列集合都可以继承使用的。
Map API如下:
方法名称 | 说明 |
---|---|
V put(K key,V value ) | 添加元素 |
V remove(Object key) | 根据键删除键值对元素 |
void clear() | 移除所有的键值对元素 |
boolean containsKey(0bject key) | 判断集合是否包含指定的键 |
boolean containsValue(0bject value) | 判断集合是否包含指定的值 |
boolean isEmpty() | 判断集合是否为空 |
int size() | 集合的长度,也就是集合中键值对的个数 |
(2)Map集合API实际使用
1.添加元素:无序,不重复,无索引。
2.清空集合
3.判断集合是否为空,为空返回true ,反之!
4.根据键获取对应值:public V get(Object key)
5.根据键删除整个元素。(删除键会返回键的值)
6.判断是否包含某个键,包含返回true ,反之
7. 判断是否包含某个值。
8. 获取全部键的集合: public Set keySet()
9. 获取全部值的集合: Collection values();
10. 集合的大小
11. 合并其他Map集合。(拓展)
public static void main(String[] args) {
// 1.添加元素:无序,不重复,无索引。
Map<String,Integer> maps = new HashMap<>();
maps.put ("iphoneX",10);
maps.put("娃娃",31);
maps.put ("iphoneX",100);// Map集合后面重复的键对应的元素会覆盖前面重复的整个元素!
maps.put("huawei",1000);
maps.put("生活用品",10);
maps.put("手表",10);
System.out.println(maps);
//{huawei=1000, 手表=10, 生活用品=10, iphoneX=100, 娃娃=31}
System.out.println("----------------------------------------------------------");
// 2.清空集合
maps.clear();
System.out.println(maps);//{}
System.out.println("----------------------------------------------------------");
// 3.判断集合是否为空,为空返回true ,反之!
System.out.println(maps.isEmpty());//true
System.out.println("----------------------------------------------------------");
Map<String,Integer> maps1 = new HashMap<>();
maps1.put ("iphoneX",10);
maps1.put("娃娃",31);
maps1.put ("iphoneX",100);// Map集合后面重复的键对应的元素会覆盖前面重复的整个元素!
maps1.put("huawei",1000);
maps1.put("生活用品",10);
maps1.put("手表",10);
System.out.println(maps1);
System.out.println("----------------------------------------------------------");
// 4.根据键获取对应值:public V get(Object key)
Integer key = maps1.get("娃娃");
System.out.println(key);//31
System.out.println(maps1.get("huawei"));//1000
System.out.println(maps1.get("vivo"));//null
System.out.println("----------------------------------------------------------");
// 5.根据键删除整个元素。(删除键会返回键的值)
System.out.println(maps1.remove("huawei"));//1000
System.out.println(maps1);
//{手表=10, 生活用品=10, iphoneX=100, 娃娃=31}
System.out.println("----------------------------------------------------------");
// 6.判断是否包含某个键,包含返回true ,反之
System.out.println(maps1.containsKey("huaiwei"));//false
System.out.println(maps1.containsKey("娃娃"));//true
System.out.println("----------------------------------------------------------");
// 7. 判断是否包含某个值。
System.out.println(maps1.containsValue(50));//false
System.out.println(maps1.containsValue(10));//true
System.out.println("----------------------------------------------------------");
// 8.获取全部键的集合: public Set<K> keySet()
Set<String> keys = maps1.keySet();
System.out.println(keys);//[手表, 生活用品, iphoneX, 娃娃]
System.out.println(maps1.keySet());//[手表, 生活用品, iphoneX, 娃娃]
System.out.println("----------------------------------------------------------");
// 9.获取全部值的集合: Collection<V> values();
//用Collection不会去重,方便
Collection<Integer> values = maps1.values();
System.out.println(values);//[10, 10, 100, 31]
System.out.println(maps1.values());//[10, 10, 100, 31]
System.out.println("----------------------------------------------------------");
//10. 集合的大小
System.out.println(maps1.size());//4
System.out.println("----------------------------------------------------------");
// 11.合并其他Map集合。(拓展)
Map<String,Integer> maps2 = new HashMap<>();
maps2.put("one",1);
maps2.put("two",2);
maps2.put("three",3);
Map<String,Integer> maps3 = new HashMap<>();
maps2.put("three",33);
maps3.put("four",4);
maps3.put("five",5);
maps2.putAll(maps3);//把集合map3的元素拷贝一份到map2中去
System.out.println(maps2);
System.out.println(maps3);
}
四、Map集合的遍历方式一:键找值
(1)键找值步骤
●先获取Map集合的全部键的Set集合。
●遍历键的Set集合,然后通过键提取对应值。
(2)键找值涉及到的API
方法名称 | 说明 |
---|---|
Set keySet() | 获取所有键的集合 |
V get(Object key) | 根据键获取值 |
(3)具体过程
public static void main(String[] args) {
//添加元素:无序,不重复,无索引。
Map<String,Integer> maps = new HashMap<>();
maps.put ("iphoneX",10);
maps.put("娃娃",31);
maps.put ("iphoneX",100);// Map集合后面重复的键对应的元素会覆盖前面重复的整个元素!
maps.put("huawei",1000);
maps.put("生活用品",10);
maps.put("手表",10);
System.out.println(maps);
//{huawei=1000, 手表=10, 生活用品=10, iphoneX=100, 娃娃=31}
// 1、键找值:第一步:先拿到集合的全部键。
Set<String> keys = maps.keySet();
// 2、第二步:遍历每个键,根据键提取值
for (String key : keys) {
int value = maps.get(key);
System.out.println(key + "====>" + value);
//huawei====>1000
//手表====>10
//生活用品====>10
//iphoneX====>100
//娃娃====>31
}
}
五、Map集合的遍历方式二:键值对
(1)键找值步骤
●先把Map集合转换成Set集合, Set集合中每个元素都是键值对实体类型了。
●遍历Set集合, 然后提取键以及提取值。
(2)键值对涉及到的APl
方法名称 | 说明 |
---|---|
Set<Map.Entry<K,V>> entrySet() | 获取所有键值对对象的集合 |
K getKey()) | 获得键 |
V getValue() | 获取值 |
Set<Map. Entry<String, Integer>> entries = maps. entrySet();
输入起来有点麻烦,可以输入maps. entrySet(),然后使用快捷键:Ctrl + Alt + V(自动补全)
直接把Map集合转为了Set集合
public static void main(String[] args) {
//添加元素:无序,不重复,无索引。
Map<String,Integer> maps = new HashMap<>();
maps.put ("iphoneX",10);
maps.put("娃娃",31);
maps.put ("iphoneX",100);// Map集合后面重复的键对应的元素会覆盖前面重复的整个元素!
maps.put("huawei",1000);
maps.put("生活用品",10);
maps.put("手表",10);
System.out.println(maps);
//{huawei=1000, 手表=10, 生活用品=10, iphoneX=100, 娃娃=31}
//{huawei=1000, 手表=10, 生活用品=10, iphoneX=100, 娃娃=31}
//使用foreach遍历map集合.发现Map集合的键值对元素直接是没有类型的。所以不可以直接foreach遍历集合。
//把Map集合先转换成Set集合: Set<Map. Entry<K, V>> entrySet();
//Set<Map.Entry<String, Integer>> entries = maps.entrySet();
//entries = [ (huawei=1000) ,(手表=10), (生活用品=10), (iphoneX=100), (娃娃=31)]
//此时键值对元素就有了类型,类型是: Map. Entry<String, Integer>
//此时可以使用foreach遍历
//1、把Map集合转换成Set集合
Set<Map.Entry<String, Integer>> entries = maps.entrySet();
//2开始遍历
for (Map.Entry<String, Integer> entry :entries) {
String key = entry.getKey();
int value = entry.getValue();
System.out.println(key + "====>" + value);
//huawei====>1000
//手表====>10
//生活用品====>10
//iphoneX====>100
//娃娃====>31
}
}
六、Map集合的遍历方式三:lambda表达式
●得益于JDK 8开始的新技术Lambda表达式,提供了一种更简单、更直接的遍历集合的方式。
(1)Map结合Lambda遍历的API
方法名称 | 说明 |
---|---|
default void forEach(BiConsumer<? super K, ? super V> action) | 结合lambda遍历Map集合 |
(2)流程
maps = {huawei=1000,手表: =10,生活用品=10, iphoneX: =100}
(3)具体过程
public static void main(String[] args) {
//添加元素:无序,不重复,无索引。
Map<String,Integer> maps = new HashMap<>();
maps.put ("iphoneX",10);
maps.put("娃娃",31);
maps.put ("iphoneX",100);// Map集合后面重复的键对应的元素会覆盖前面重复的整个元素!
maps.put("huawei",1000);
maps.put("生活用品",10);
maps.put("手表",10);
System.out.println(maps);
//{huawei=1000, 手表=10, 生活用品=10, iphoneX=100, 娃娃=31}
// maps.forEach(new BiConsumer<String, Integer>() {
// @Override
// public void accept(String key, Integer value) {
// System.out.println(key + "====>" + value);
// }
// });
//简化
maps.forEach((k,v) -> {
System.out.println(k + "====>" + v);
});
}