Map集合概述和使用
- Map集合是一种双列集合,每个元素包含两个数据。
- Map集合的每个元素的格式:key=value(键值对元素)。
- Map集合也被称为“键值对集合”。
Map集合整体格式:
- Collection集合的格式:[元素1,元素2,元素3..]
- Map集合的完整格式:{key1=value1 , key2=value2 , key3=value3 , ...}
使用场景:Map集合非常适合做类购物车这样的业务场景。
Map集合体系特点
- Map集合的特点都是由键决定的。
- Map集合的键是无序,不重复的,无索引的,值不做要求(可以重复)。
- Map集合后面重复的键对应的值会覆盖前面重复键的值。
- Map集合的键值对都可以为null。
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
public class MapDemo {
public static void main(String[] args) {
// Map<String,Integer> maps = new HashMap<>();
Map<String,Integer> maps = new LinkedHashMap<>();
maps.put("鸿星尔克",3);
maps.put("java",100);
maps.put("mysql",44);
maps.put("html",100);
maps.put("java",1);
maps.put(null,null);
// System.out.println(maps);//HashMap {null=null, java=1, mysql=44, html=100, 鸿星尔克=3}
System.out.println(maps);//LinkedHashMap {鸿星尔克=3, java=1, mysql=44, html=100, null=null}
}
}
Map集合实现类特点
- HashMap:元素按照键是无序,不重复,无索引,值不做要求。(与Map体系一致)
- LinkedHashMap:元素按照键是有序,不重复,无索引,值不做要求。
- TreeMap:元素按照键是有序,不重复,无索引的,值不做要求。
Map集合常用API
方法名称 | 说明 |
V put(K key,V value) | 添加元素 |
V remove(Object key) | 根据键删除键值对元素 |
void clear() | 移除所有的键值对元素 |
boolean containsKey(Object key) | 判断集合是否包含指定的键 |
boolean containsValue(Object value) | 判断集合是否包含指定的值 |
boolean isEmpty() | 判断集合是否为空 |
int size() | 集合的长度,也就是集合中键值对的个数 |
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class MapDemo2 {
public static void main(String[] args) {
// 1.添加元素:无序,不重复,无索引。
Map<String,Integer> maps = new HashMap<>();
maps.put("iphoneX",10);
maps.put("娃娃",20);
maps.put("iphoneX",100); // Hap集合后面重复的键对应的元素会覆盖前面重复的整个元素!
maps.put( "huawei" ,100);
maps.put("生活用品",10);
maps.put("手表",10);
System.out.println(maps);//{huawei=100, 手表=10, 生活用品=10, iphoneX=100, 娃娃=20}
//2、清空集合
// maps.clear();
// System.out.println(maps); //{}
//3、判断集合是否为空,为空返回true,反之!
System.out.println(maps.isEmpty());
//4、根据键获取对应的值
Integer key = maps.get("huawei");
System.out.println(key); //100
System.out.println(maps.get("生活用品")); //10
System.out.println(maps.get("生活用品2")); //null
//5、根据键删除整个元素。(删除键会返回键的值)
System.out.println(maps.remove("iphoneX"));
System.out.println(maps);
//6、判断是否包含某个键,包含返回true,反之!
System.out.println(maps.containsKey("娃娃"));//true
System.out.println(maps.containsKey("娃娃2"));//false
System.out.println(maps.containsKey("iphoneX"));//false 因为前面删掉了
//7、判断是否包含某个值。
System.out.println(maps.containsValue(100));//true
System.out.println(maps.containsValue(10));//true
System.out.println(maps.containsValue(22));//false
//8、获取全部键的集合
Set<String> keys = maps.keySet();
System.out.println(keys);//[huawei, 手表, 生活用品, 娃娃]
//9、获取全部值的集合
Collection<Integer> values = maps.values();
System.out.println(values);//[100, 10, 10, 20]
//10、集合的大小
System.out.println(maps.size());//4
//11、合并其他map集合
Map<String, Integer> map1 = new HashMap<>();
map1.put("java1",1);
map1.put("java2",100);
Map<String, Integer> map2 = new HashMap<>();
map2.put("java3",1);
map2.put("java2",1);
map1.putAll(map2);
System.out.println(map1);//{java3=1, java2=1, java1=1}
System.out.println(map2);//{java2=1, java3=1}
}
}
Map集合的遍历方式一:键找值
- 先获取Map集合的全部键的Set集合。
- 遍历键的Set集合,然后通过键提取对应值。
- 键找值涉及到的API:
方法名称 | 说明 |
Set<K> keySet() | 获取所有键的集合 |
V get(Object key) | 根据键获取值 |
Map集合的遍历方式二:键值对
- 先把Map集合转换成Set集合,Set集合中每个元素都是键值对实体类型了。
- 遍历Set集合,然后提取键以及提取值。
- 键值对涉及到的API:
方法名称 | 说明 |
Set<Map.Entry<K,V>> entrySet() | 获取所有键值对对象的集合 |
K getKey() | 获得键 |
V getValue() | 获取值 |
Map集合的遍历方式三:Lambda
- 得益于JDK8开始的新技术Lambda表达式,提供了一种更简单、更直接的遍历集合的方式。
Map结合Lambda遍历的API
方法名称 | 说明 |
default void forEach(BiConsumer<? super K,? super V> action) | 结合lambda遍历Map集合 |
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.function.BiConsumer;
public class MapDemo3 {
public static void main(String[] args) {
// 1.添加元素:无序,不重复,无索引。
Map<String,Integer> maps = new HashMap<>();
maps.put("iphoneX",10);
maps.put("娃娃",20);
maps.put( "huawei" ,100);
maps.put("生活用品",10);
maps.put("手表",10);
System.out.println(maps);//{huawei=100, 手表=10, 生活用品=10, iphoneX=10, 娃娃=20}
//1、方式一键找值:第一步:先拿到集合的全部键
// Set<String> keys = maps.keySet();
// //2、第二步:遍历每个键,根据键取值
// for (String key : keys) {
// int value = maps.get(key);
// System.out.println(key + "==>" + value);
// }
//方式二:键值对,把Map集合转成Set集合
// Set<Map.Entry<String, Integer>> entries = maps.entrySet();
// for (Map.Entry<String, Integer> entry:entries){
// String key = entry.getKey();
// Integer value = entry.getValue();
// System.out.println(key+"==>"+value);
// }
//方式三:Lambda
// 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));
}
}