java中HashMap的七种遍历方式

简介: java.util.ConcurrentModificationException , 这种办法是非安全的 , 我们可以使用Iterator.remove() ,或者是Lambda 中的 removeIf() , 或者是Stream 中的 filter() 过滤或者删除相关数据

1.HashMap遍历方式分类

HashMap的多种遍历方式从大体中归类 , 可以分为以下4类 :


迭代器(Iterator)


For Each


Lambda (JDK 1.8 +)


Streams API (JDK 1.8 +)


但是每种方式又有不同的实现类型 :


使用迭代器(Iterator)EntrySet / KeySet 的方式进行遍历;


使用 For Each EntrySet / For Each KeySet 的方式进行遍历;


使用 Lambda 表达式的方式进行遍历;


使用 Streams API 单线程 / 多线程 的方式进行遍历;


接下来我们看每种方式的具体实现代码


1.1. 迭代器(Iterator)EntrySet

HashMap<String , String> hashMap = new HashMap<>();
hashMap.put("1","name");
hashMap.put("2","age");
Iterator<Map.Entry<String, String>> iterator = hashMap.entrySet().iterator();
while (iterator.hasNext()) {
    Map.Entry<String, String> entry = iterator.next();
    Object key = entry.getKey();
    Object val = entry.getValue();
    System.out.println("key : " + key + "-----" + "val : " + val);
}

1.2. 迭代器(Iterator)KeySet

HashMap<String , String> hashMap = new HashMap<>();
hashMap.put("1","name");
hashMap.put("2","age");
Iterator<String> iterator = hashMap.keySet().iterator();
while (iterator.hasNext()) {
    String key = iterator.next();
    Object val = hashMap.get(key);
    System.out.println("key : " + key + "-----" + "val : " + val);
}

1.3. For Each EntrySet

HashMap<String , String> hashMap = new HashMap<>();
hashMap.put("1","name");
hashMap.put("2","age");
for (Map.Entry<String, String> entry : hashMap.entrySet()) {
    Object key = entry.getKey();
    Object val = entry.getValue();
    System.out.println("key : " + key + "-----" + "val : " + val);
}

1.4. For Each KeySet

HashMap<String , String> hashMap = new HashMap<>();
hashMap.put("1","name");
hashMap.put("2","age");
for (String key : hashMap.keySet()) {
    Object val = hashMap.get(key);
    System.out.println("key : " + key + "-----" + "val : " + val);
}

1.5. Lambda

HashMap<String , String> hashMap = new HashMap<>();
hashMap.put("1","name");
hashMap.put("2","age");
hashMap.forEach((key , val) -> System.out.println("key : " + key + "-----" + "val : " + val));

1.6.Streams API 单线程

HashMap<String , String> hashMap = new HashMap<>();
hashMap.put("1","name");
hashMap.put("2","age");
hashMap.entrySet().stream().forEach((entry) -> {
    Object key = entry.getKey();
    Object val = entry.getValue();
    System.out.println("key : " + key + "-----" + "val : " + val);
});

1.7.Streams API 多线程

HashMap<String , String> hashMap = new HashMap<>();
hashMap.put("1","name");
hashMap.put("2","age");
hashMap.entrySet().stream().parallel().forEach((entry) -> {
    Object key = entry.getKey();
    Object val = entry.getValue();
    System.out.println("key : " + key + "-----" + "val : " + val);
});

注 : 我们不能在遍历Map时使用map.remove()方法 , 否则就会抛出异常 :


java.util.ConcurrentModificationException , 这种办法是非安全的 , 我们可以使用Iterator.remove() ,或者是Lambda 中的 removeIf() , 或者是Stream 中的 filter() 过滤或者删除相关数据

相关文章
|
12月前
|
存储 安全 Java
Java 集合框架中的老炮与新秀:HashTable 和 HashMap 谁更胜一筹?
嗨,大家好,我是技术伙伴小米。今天通过讲故事的方式,详细介绍 Java 中 HashMap 和 HashTable 的区别。从版本、线程安全、null 值支持、性能及迭代器行为等方面对比,帮助你轻松应对面试中的经典问题。HashMap 更高效灵活,适合单线程或需手动处理线程安全的场景;HashTable 较古老,线程安全但性能不佳。现代项目推荐使用 ConcurrentHashMap。关注我的公众号“软件求生”,获取更多技术干货!
208 3
Java之HashMap详解
本文介绍了Java中HashMap的源码实现(基于JDK 1.8)。HashMap是基于哈希表的Map接口实现,允许空值和空键,不同步且线程不安全。文章详细解析了HashMap的数据结构、主要方法(如初始化、put、get、resize等)的实现,以及树化和反树化的机制。此外,还对比了JDK 7和JDK 8中HashMap的主要差异,并提供了使用HashMap时的一些注意事项。
400 2
Java之HashMap详解
|
6月前
|
存储 安全 Java
Java 集合面试题从数据结构到 HashMap 源码剖析详解及长尾考点梳理
本文深入解析Java集合框架,涵盖基础概念、常见集合类型及HashMap的底层数据结构与源码实现。从Collection、Map到Iterator接口,逐一剖析其特性与应用场景。重点解读HashMap在JDK1.7与1.8中的数据结构演变,包括数组+链表+红黑树优化,以及put方法和扩容机制的实现细节。结合订单管理与用户权限管理等实际案例,展示集合框架的应用价值,助你全面掌握相关知识,轻松应对面试与开发需求。
326 3
|
存储 Java
Java中的HashMap和TreeMap,通过具体示例展示了它们在处理复杂数据结构问题时的应用。
【10月更文挑战第19天】本文详细介绍了Java中的HashMap和TreeMap,通过具体示例展示了它们在处理复杂数据结构问题时的应用。HashMap以其高效的插入、查找和删除操作著称,而TreeMap则擅长于保持元素的自然排序或自定义排序,两者各具优势,适用于不同的开发场景。
147 1
|
10月前
|
存储 缓存 安全
Java HashMap详解及实现原理
Java HashMap是Java集合框架中常用的Map接口实现,基于哈希表结构,允许null键和值,提供高效的存取操作。它通过哈希函数将键映射到数组索引,并使用链表或红黑树解决哈希冲突。HashMap非线程安全,多线程环境下需注意并发问题,常用解决方案包括ConcurrentHashMap和Collections.synchronizedMap()。此外,合理设置初始化容量和加载因子、重写hashCode()和equals()方法有助于提高性能和避免哈希冲突。
573 17
Java HashMap详解及实现原理
|
9月前
|
存储 监控 Java
《从头开始学java,一天一个知识点》之:数组入门:一维数组的定义与遍历
**你是否也经历过这些崩溃瞬间?** - 看了三天教程,连`i++`和`++i`的区别都说不清 - 面试时被追问&quot;`a==b`和`equals()`的区别&quot;,大脑突然空白 - 写出的代码总是莫名报NPE,却不知道问题出在哪个运算符 这个系列就是为你打造的Java「速效救心丸」!我们承诺:每天1分钟,地铁通勤、午休间隙即可完成学习;直击痛点,只讲高频考点和实际开发中的「坑位」;拒绝臃肿,没有冗长概念堆砌,每篇都有可运行的代码标本。明日预告:《多维数组与常见操作》。 通过实例讲解数组的核心认知、趣味场景应用、企业级开发规范及优化技巧,帮助你快速掌握Java数组的精髓。
205 23
|
存储 Java 开发者
在 Java 中,如何遍历一个 Set 集合?
【10月更文挑战第30天】开发者可以根据具体的需求和代码风格选择合适的遍历方式。增强for循环简洁直观,适用于大多数简单的遍历场景;迭代器则更加灵活,可在遍历过程中进行更多复杂的操作;而Lambda表达式和`forEach`方法则提供了一种更简洁的函数式编程风格的遍历方式。
4405 113
|
存储 Java 程序员
Java面试加分点!一文读懂HashMap底层实现与扩容机制
本文详细解析了Java中经典的HashMap数据结构,包括其底层实现、扩容机制、put和查找过程、哈希函数以及JDK 1.7与1.8的差异。通过数组、链表和红黑树的组合,HashMap实现了高效的键值对存储与检索。文章还介绍了HashMap在不同版本中的优化,帮助读者更好地理解和应用这一重要工具。
731 5
|
Java 程序员 编译器
Java|如何正确地在遍历 List 时删除元素
从源码分析如何正确地在遍历 List 时删除元素。为什么有的写法会导致异常,而另一些不会。
373 3
|
存储 Java API
详细解析HashMap、TreeMap、LinkedHashMap等实现类,帮助您更好地理解和应用Java Map。
【10月更文挑战第19天】深入剖析Java Map:不仅是高效存储键值对的数据结构,更是展现设计艺术的典范。本文从基本概念、设计艺术和使用技巧三个方面,详细解析HashMap、TreeMap、LinkedHashMap等实现类,帮助您更好地理解和应用Java Map。
258 3