JAVA 集合进阶 01 - 05 双列集合
1 双列集合
- 双列集合一次需要存一对数据,分别为键和值
- 键不能重复,值可以重复
- 键和值是一一对应的,每一个键只能找到自己对应的值
- 键+值这个整体我们称之为“键值对”或者“键值对对象”,在Java中叫做“Entry对象"
2 双列集合常用 API
Map 是双列集合的顶层接口,它的功能是全部双列集合都可以继承使用的
- V put(K key,V value) 添加元素
- V remove(object key) 根据键删除键值对元素
- void clear() 移除所有的键值对元素
- boolean containsKey(object key) 判断集合是否包含指定的键
- boolean containsValue(object value) 判断集合是否包含指定的值
- boolean isEmpty() 判断集合是否为空
- int size() 集合的长度,也就是集合中键值对的个数
2.1 例子
package com.bjpowernode.test18;import java.util.HashMap;
import java.util.Map;public class MapDemo1 {public static void main(String[] args) {//创建 Map 集合的对象//Map 是接口,不能直接创建接口的对象,要创建接口实现类的对象,比如 HashMap 类的对象//Map 接口规定了两个泛型,第一个是键,第二个是值Map<String, String> m = new HashMap<>();//添加元素//put 方法的细节://添加 或 覆盖//在添加数据的时候,如果键不存在,那么直接把键值对对象添加到 map 集合中,方法返回 null//在添加数据的时候,如果键存在,那么会把原有的键值对对象覆盖,并且会把被覆盖的值进行返回!!m.put("001","张三");m.put("002","李四");m.put("003","王五");System.out.println(m); //{001=张三, 002=李四, 003=王五}//删除String result = m.remove("001");System.out.println(result); //张三System.out.println(m); //{002=李四, 003=王五}//清空
// m.clear();
// System.out.println(m); //{}//判断键是否存在boolean keyResult = m.containsKey("002");System.out.println(keyResult); //true//判断集合是否为空boolean empty = m.isEmpty();System.out.println(empty); //false//集合长度int size = m.size();System.out.println(size); //2}
}
3 Map 集合遍历方式
3.1 第一种遍历方式:键找值
遍历的写法有三种:增强 for 、 迭代器 、 Lambda 表达式
package com.bjpowernode.test18;import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;public class MapDemo2 {public static void main(String[] args) {//Map 集合的第一种遍历方式//创建 Map 集合的对象Map<String, String> map = new HashMap<>();//添加元素map.put("001", "张三");map.put("002", "李四");map.put("003", "王五");//键找值 遍历// 1 获取所有的键,把这些键放到一个单列集合中Set<String> keys = map.keySet();// 2 遍历单列集合,得到每一个键for (String key : keys) { //用增强 for 的方式进行遍历//System.out.print(key + " "); // 001 002 003// 利用 map 集合中的键获取对应的值 getString value = map.get(key); //即用键找值System.out.println(key + " = " + value);}//用迭代器遍历集合Iterator<String> iterator = keys.iterator();while (iterator.hasNext()){String key = iterator.next(); //用迭代器获取键String value = map.get(key); //即用键找值System.out.println(key + " = " + value);}//用 Lambda 表达式map.forEach((key, value) -> {System.out.println(key + " = " + value);});}
}
3.2 第二种遍历方式:键值对
遍历的写法有三种:增强 for 、 迭代器 、 Lambda 表达式
package com.bjpowernode.test18;import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;public class MapDemo3 {public static void main(String[] args) {//创建 Map 集合的对象Map<String, String > map = new HashMap<>();//添加元素map.put("001", "张三");map.put("002", "李四");map.put("003", "王五");//Map 集合的第二种遍历方式,通过键值对// 1 通过一个方法获取所有的键值对对象,返回一个 Set 集合Set<Map.Entry<String, String>> entries = map.entrySet(); // entries 是存放键值对// 2 遍历 entries 这个集合,去得到里边的每一个键值对对象for (Map.Entry<String, String> entry : entries) { //增强 for// 3 利用 entry 调用 get 方法获取键和值String key = entry.getKey();String value = entry.getValue();System.out.println(key + " = " + value);}// 迭代器遍历Iterator<Map.Entry<String, String>> iterator = entries.iterator();while (iterator.hasNext()){Map.Entry<String, String> next = iterator.next();String key = next.getKey();String value = next.getValue();System.out.println(key + " = " + value);}//Lambda 表达式map.entrySet().forEach(entry -> {System.out.println(entry.getKey() + " = " + entry.getValue());});}
}
3.2 第三种遍历方式:Lambda表达式
3.2.1 利用 Lambda 表达式进行简写匿名内部类
- 先删除从 new 到 方法名 accept
- 从最后删除一个 }
- 在 形参 和 { 之间,加上 ->
3.2.2 还可以继续简化
- 参数的类型可以省略
- 如果只有一个参数,那么 () 也可以省略
- 如果方法体只有一行,那么 {} 、return 、分号 可以省略
package com.bjpowernode.test18;import java.util.HashMap;
import java.util.Map;
import java.util.function.BiConsumer;public class MapDemo4 {public static void main(String[] args) {//创建 Map 集合的对象Map<String, String > map = new HashMap<>();//添加元素map.put("001", "张三");map.put("002", "李四");map.put("003", "王五");//先写匿名内部类//new Bi直接回车即可//forEach 底层://forEach其实就是利用第二种方式进行遍历,依次得到每一个键和值//再调用accept方法map.forEach(new BiConsumer<String, String>() {@Overridepublic void accept(String key, String value) {System.out.println(key + " = " + value);}});//利用 Lambda 表达式进行简写匿名内部类// 1 先删除从 new 到 方法名 accept// 2 从最后删除一个 }// 3 在 形参 和 { 之间,加上 ->map.forEach((String key, String value) -> {System.out.println(key + " = " + value);});//还可以继续简化// 1 参数的类型可以省略// 2 如果只有一个参数,那么 () 也可以省略// 3 如果方法体只有一行,那么 {} 、return 、分号 可以省略map.forEach(( key, value) -> System.out.println(key + " = " + value));}
}
参考链接:
集合进阶-02-Map集合常用的API_哔哩哔哩_bilibili
集合进阶-03-Map集合的第一种遍历方式(键找值)_哔哩哔哩_bilibili
集合进阶-04-Map集合的第二种遍历方式(键值对)_哔哩哔哩_bilibili
集合进阶-05-Map集合的第三种遍历方式(lambda表达式)_哔哩哔哩_bilibili