一、Map集合的概述
Map集合概述和使用
● Map集合是一种双列集合,每个元素包含两个数据。
● Map集合的每个元素的格式:key=value(键值对元素)。
● Map集合称为“键值对集合”。
Map集合整体格式
● Collection集合的格式:[元素1,元素2,元素3,...]
● Map集合的完整格式:{key1=value,key2=value2,key3=value3,...}
Map集合的使用场景之一:购物车系统
分析
● 购物车提供的四个商品和购买的数量在后台需要容器存储。
● 每个商品对象都一 一对应一个数量。
● 把商品对象看成是Map集合的键,购买数量堪称Map集合的值。
{商品1=2,商品2=3,商品3=2,商品4=3}
总结:
Map集合是什么?使用场景是什么样的?
● Map集合是键值对集合
● Map集合非常适合做类购物车这样的业务场景
二、Map集合体系特点
Map集合体系
说明
● 使用最多的Map集合是HashMap。
● 重点掌握HashMap,LinkedHashMap,TreeMap。
Map集合体系特点
● Map集合的特点都是由键决定的。
● Map集合的建是无序、不重复、无索引、值不做要求(可以重复)。
● Map集合后面重复的键对应的值会覆盖前面重复键的值。
● Map集合的键值对都可以为null。
Map集合实现类特点
● HashMap:无序、不重复、无索引、值不做要求。(与Map体系一致)
● LikedHashMap:有序、不重复、无索引、值不做要求。
● TreeMap:排序、不重复、无索引、值不做要求。
【代码示例】
/**
* 目标:认识Map特点体系:按照键无序、不重复、无索引、值不做要求
*/
public class MapDemo1 {
public static void main(String[] args){
//1.创建一个Map集合对象
Map<String, Integer> maps = new HashMap<>();
maps.put("鸿星尔克",3);
maps.put("Java",2);
maps.put("枸杞",100);
maps.put("安踏",4);
maps.put("Java",77); //覆盖前面的数据
maps.put(null,null);
System.out.println(maps);
Map<String, Integer> maps1 = new LinkedHashMap<>();
maps1.put("鸿星尔克",3);
maps1.put("Java",2);
maps1.put("枸杞",100);
maps1.put("安踏",4);
maps1.put("Java",77); //覆盖前面的数据
maps1.put(null,null);
System.out.println(maps1);
}
}
运行结果:
{null=null, Java=77, 枸杞=100, 鸿星尔克=3, 安踏=4}
{鸿星尔克=3, 枸杞=100, Java=77, 安踏=4, null=null}
三、Map集合常用API
Map集合
● Map是双列集合的祖宗接口,它的功能是全部双列集合都可以继承使用的。
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( ) | 集合的长度,也就是集合中兼职对的个数 |
【代码示例1】添加元素
public class MapDemo {
public static void main(String[] args) {
// 1.添加元素: 无序、不重复、无索引
Map<String, Integer> maps = new HashMap<>();
maps.put("iphone",10);
maps.put("娃娃",20);
maps.put("iphone",100);
maps.put("huawei",100);
maps.put("生活用品",10);
maps.put("手表",10);
System.out.println(maps);
}
}
运行结果:
{huawei=100, 手表=10, 生活用品=10, 娃娃=20, iphone=100}
【代码示例2】清空集合
maps.clear();
System.out.println(maps); // {}
【代码示例3】判断集合是否为空,为空返回true,反之!
System.out.println(maps.isEmpty()); // false
【代码示例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("iphone")); // 100
System.out.println(maps);
运行结果:
100
{huawei=100, 手表=10, 生活用品=10, 娃娃=20}
【示例代码6】判断是否包含某个键,包含返回true,反之!
System.out.println(maps.containsKey("娃娃")); // true
System.out.println(maps.containsKey("娃娃2")); // true
System.out.println(maps.containsKey("iphoneX")); // true
【示例代码7】判断是否包含某个值
System.out.println(maps.containsValue(100)); // true
System.out.println(maps.containsValue(10)); // true
System.out.println(maps.containsValue(22)); // false
【示例代码8】获取全部键的集合
// {huawei=100, 手表=10, 生活用品=10, 娃娃=20, iphone=100}
// 获取全部键的集合:public Set<K> keySet<>
// Set集合也是无序,不重复,无索引。底层原理一样。 所以可用Set收集
Set<String> keys = maps.keySet();
System.out.println(keys);
【代码示例9】获取全部值的集合
// 获取全部值的集合:Collection<V> values();
Collection<Integer> values = maps.values();
System.out.println(values); // [100, 10, 10, 20, 100]
【代码示例10】集合的大小
System.out.println(maps.size()); // 5
【代码示例11】合并其他集合
public class MapDemo {
public static void main(String[] args) {
Map<String, Integer> map1 = new HashMap<>();
map1.put("Java1",1);
map1.put("Java2",100);
System.out.println(map1);
Map<String, Integer> map2 = new HashMap<>();
map2.put("Java2",1);
map2.put("Java3",100);
System.out.println(map2);
System.out.println("-------合并后如下-------");
map1.putAll(map2);
System.out.println(map1);
System.out.println(map2);
}
}
运行结果:
{Java2=100, Java1=1}
{Java2=1, Java3=100}
-------合并后如下-------
{Java2=1, Java3=100, Java1=1}
{Java2=1, Java3=100}
四、Map集合的遍历方式一:键找值
Map集合的遍历方式一:键找值
● 先获取Map集合的全部键的Set集合。
● 遍历的Set集合,然后通过键提取对应值。
键找值涉及到的API
方法名称 | 说明 |
Set<K> keySet( ) | 获取所有键的集合 |
V get(Object key) | 根据键获取值 |
【代码示例】
public class MapDemo01 {
public static void main(String[] args){
Map<String, Integer> maps = new HashMap();
// 1.添加元素:无序、不重复、无索引
maps.put("娃娃",30);
maps.put("iphone",100);
maps.put("huawei",1000);
maps.put("生活用品",10);
maps.put("手表",10);
// 1.键找值:第一步:先拿到集合的全部键
Set<String> keys = maps.keySet();
System.out.println(keys);
// 2.第二步:遍历每个键,根据键提取值
for(String ele : keys){
Integer value = maps.get(ele);
System.out.println(ele + " ===> " + value);
}
}
}
运行结果:
[huawei, 手表, 生活用品, 娃娃, iphone]
huawei ===> 1000
手表 ===> 10
生活用品 ===> 10
娃娃 ===> 30
iphone ===> 100
五、Map集合的遍历方式二:键值对
● 遍历Map集合的遍历方式二:键值对
● 先把Map集合转换成Set集合,Set集合中每个元素都是键值对实体类型了。
● 遍历Set集合,然后提取键以及提取值。
键值对设计到的API
方法名称 | 说明 |
Set<Map.Entry<K,V>> entrySet( ) | 获取所有键值对对象的集合 |
K getKey( ) | 获取键 |
V getValue( ) | 获取值 |
【代码示例】
public class MapDemo02 {
public static void main(String[] args) {
Map<String , Integer> maps = new HashMap<>();
// 1.添加元素: 无序,不重复,无索引。
maps.put("娃娃",30);
maps.put("iphoneX",100);
maps.put("huawei",1000);
maps.put("生活用品",10);
maps.put("手表",10);
System.out.println(maps);
// maps = {huawei=1000, 手表=10, 生活用品=10, iphoneX=100, 娃娃=30}
/**
maps = {huawei=1000, 手表=10, 生活用品=10, iphoneX=100, 娃娃=30}