- 作者简介:大家好,我是五度鱼,一个普通的Java领域博主,不停输出Java技术博客和干货。
- 个人主页:五度鱼学Java的主页
文章目录
前言
当我们需要对一个集合进行遍历时,通常情况下我们会选择使用 Java 集合框架中的 Map
接口或者其实现类。在 Java 中,Map
是一个键值对的集合,它将键和值以映射的形式存储起来。通过遍历 Map
,我们可以获取到每一个键值对,并进行相应的操作。
在 Java 中,Map
集合的遍历方式有很多种,每种方式都有其独特的特点和适用场景。在这篇博客中,我们将介绍六种常见的 Map
集合遍历方式,它们分别是:
- 使用
for-each
循环遍历Map
的所有键值对。 - 使用
entrySet()
方法获取Map
的所有键值对,并使用增强型 for 循环进行遍历。 - 使用
keySet()
方法获取Map
的所有键,并使用增强型 for 循环进行遍历。 - 使用
values()
方法获取Map
的所有值,并使用增强型 for 循环进行遍历。 - 使用迭代器(
Iterator
)进行遍历。 - 使用
for-each
循环结合 Lambda 表达式进行遍历。
这些遍历方式各有优缺点,可以根据具体的需求来选择适合的方式。在这篇博客中,我们将详细介绍每种方式的用法和注意事项,以便读者能够更好地理解和应用它们。同时,我们还将提供一些实用的示例代码,帮助读者更好地理解和掌握这些方法的使用技巧。
一、第一类通过key取出对应的value值两种方式
public class Map六大遍历方式 {
public static void main(String[] args) {
HashMap map = new HashMap();
map.put("邓超","孙俪");
map.put("张三","李四");
map.put("王五","赵六");
map.put("刘玲博",null);
map.put(null,"刘亦菲");
map.put("鹿晗","关晓彤");
//先取出所有的key,在通过key取出对应的value值
Set keySet = map.keySet();
//增强for第一种
for (Object key : keySet) {
System.out.println(key + "-" + map.get(key));
}
System.out.println("===========");
//迭代器
Iterator iterator = keySet.iterator();
while (iterator.hasNext()) {
Object key = iterator.next();
System.out.println(key + "-" + map.get(key));
}
}
}
二、通过values接口取出所有的value
public class Map六大遍历方式 {
public static void main(String[] args) {
HashMap map = new HashMap();
map.put("邓超","孙俪");
map.put("张三","李四");
map.put("王五","赵六");
map.put("刘玲博",null);
map.put(null,"刘亦菲");
map.put("鹿晗","关晓彤");
Collection values = map.values();
for (Object value : values) {
System.out.println(value);
}
System.out.println("===========");
Iterator iterator1 = values.iterator();
while (iterator1.hasNext()) {
Object value = iterator1.next();
System.out.println(value);
}
}
}
三、第三种通过Map.Entry<K,V> 接口entrySet方法取出key-value
entrySet方法源码分析
1、调用entrySet方法返回一个集合HashMap源码里static class Node<K,V> implements Map.Entry<K,V> {…}Node<K,V>。
2、实际上实现了Map.Entry<K,V>接口。
3、底层把Node<K,V>对象封装到Map.Entry<K,V>里。
4、再Map接口里通过调用嵌套接口Map.Entry<K,V> Map.Entry<K,V>并且接口里提供了K getKey();V getValue();方法方便获取Key和Value。
public class Map六大遍历方式 {
public static void main(String[] args) {
HashMap map = new HashMap();
map.put("邓超","孙俪");
map.put("张三","李四");
map.put("王五","赵六");
map.put("刘玲博",null);
map.put(null,"刘亦菲");
map.put("鹿晗","关晓彤");
Set entrySet = map.entrySet();
for (Object entry : entrySet) {
Map.Entry m = (Map.Entry) entry;
System.out.println(m.getKey() + "-" + m.getValue());
}
System.out.println("===========");
Iterator iterator2 = entrySet.iterator();
while (iterator2.hasNext()) {
//entry的编译类型是Object,Object没有getKey方法,
//entry的运行类型是HashMap$Node,所以向下转型成Map.Entry
Object entry = iterator2.next();
Map.Entry m = (Map.Entry) entry;
System.out.println(m.getKey() + "-" + m.getValue());
}
}
}
itertor迭代器解析
- 1、通过调用
hasNext()
方法判断下一个位置是否有值 - 2、调用
next()
方法返回Object类型的值,这个值就是指向集合中的对象 - 3、这里用到多态的向上转型
Object obj = new Employee();
父类引用指向子类对象 - 4、所以输出obj时
System.out.println(obj);
默认输出obj.toString(),
输出的不是obj类型输出的是运行类型 - 5、增强for循环底层也是用的Itertor迭代器
Object obj = new Employee();
obj.toString()
码文不易,最后求个关注,点赞,收藏,谢谢!