首页 > 其他分享 >遍历 hashmap 的三种方式

遍历 hashmap 的三种方式

时间:2024-11-24 15:02:19浏览次数:4  
标签:map 遍历 hashmap entrySet keySet 三种 values HashMap

1. 使用 entrySet() 遍历 HashMap

1.1 概述

entrySet() 方法返回 HashMap 中所有键值对的集合。每个键值对被封装成一个 Map.Entry 对象。使用 entrySet() 可以方便地同时获取键和值,是最常用的遍历 HashMap 的方式之一。

1.2 示例代码

以下是使用 entrySet() 遍历 HashMap 的示例代码:

import java.util.HashMap;
import java.util.Map;

public class HashMapEntrySetExample {

    public static void main(String[] args) {
        // 创建一个HashMap并添加一些键值对
        HashMap<String, Integer> map = new HashMap<>();
        map.put("Alice", 30);
        map.put("Bob", 25);
        map.put("Charlie", 35);

        // 使用entrySet()遍历HashMap
        for (Map.Entry<String, Integer> entry : map.entrySet()) {
            System.out.println("Key: " + entry.getKey() + ", Value: " + entry.getValue());
        }
    }
}
1.3 工作原理
  • entrySet() 方法返回一个包含 Map.Entry 对象的集合。Map.Entry 是一个接口,它封装了 HashMap 中的键和值。
  • 通过遍历 entrySet() 集合,开发者可以轻松地访问每个键值对,获取键和值的操作非常直接。
1.4 优点
  • 同时访问键和值:使用 entrySet() 是遍历 HashMap 时最直接的方法,因为它允许同时访问键和值,代码简洁且性能较好。
  • 性能优越:相对于其他方法,entrySet() 遍历在性能上更为高效,因为它避免了多次查找操作。

2. 使用 keySet() 遍历 HashMap

2.1 概述

keySet() 方法返回 HashMap 中所有键的集合。通过遍历这个集合,可以使用每个键来获取对应的值。这种方法适合仅对键进行操作,或需要基于键来获取值的场景。

2.2 示例代码

以下是使用 keySet() 遍历 HashMap 的示例代码:

import java.util.HashMap;
import java.util.Map;

public class HashMapKeySetExample {

    public static void main(String[] args) {
        // 创建一个HashMap并添加一些键值对
        HashMap<String, Integer> map = new HashMap<>();
        map.put("Alice", 30);
        map.put("Bob", 25);
        map.put("Charlie", 35);

        // 使用keySet()遍历HashMap
        for (String key : map.keySet()) {
            System.out.println("Key: " + key + ", Value: " + map.get(key));
        }
    }
}
2.3 工作原理
  • keySet() 方法返回一个包含 HashMap 所有键的集合。通过遍历这个键集合,可以使用 map.get(key) 获取对应的值。
  • keySet() 方法适合在只关心键或者基于键来处理值的场景。
2.4 优点和缺点
  • 优点

    • 简单直接keySet() 是遍历 HashMap 键的最简单方法,代码直观且易于理解。
    • 灵活性:如果只对键进行操作,keySet() 是最合适的选择。
  • 缺点

    • 性能劣势:如果需要获取值,则每次通过 map.get(key) 获取值的操作会导致额外的查找成本(复杂度为 O(1)),特别是在大数据量时,相较于 entrySet() 遍历的性能略差。

3. 使用 values() 遍历 HashMap

3.1 概述

values() 方法返回 HashMap 中所有值的集合。这种遍历方式只适合在你只关心值,而不关心键的场景。

3.2 示例代码

以下是使用 values() 遍历 HashMap 的示例代码:

import java.util.HashMap;

public class HashMapValuesExample {

    public static void main(String[] args) {
        // 创建一个HashMap并添加一些键值对
        HashMap<String, Integer> map = new HashMap<>();
        map.put("Alice", 30);
        map.put("Bob", 25);
        map.put("Charlie", 35);

        // 使用values()遍历HashMap
        for (Integer value : map.values()) {
            System.out.println("Value: " + value);
        }
    }
}
3.3 工作原理
  • values() 方法返回 HashMap 中所有值的集合。这种方法最适合在你不需要键信息,仅对值进行处理的场景。
  • 由于不涉及键的处理,代码显得更加简洁。
3.4 优点和缺点
  • 优点

    • 简单直接values() 是遍历 HashMap 值的最简单方法。
    • 代码简洁:对于只关心值的场景,代码更简洁明了。
  • 缺点

    • 无法访问键:如果需要同时访问键和值,那么 values() 不是合适的选择,因为它只返回值,没有键的上下文信息。

4. 三种遍历方式的性能比较

4.1 性能分析
  1. entrySet()

    • 最优的遍历方式,因为它直接返回键值对的集合,避免了重复查找操作。
    • 在大多数情况下,使用 entrySet() 都是最好的选择,特别是在需要同时访问键和值时。
  2. keySet()

    • 性能次优,需要额外通过 map.get(key) 获取值,虽然 get() 操作的时间复杂度为 O(1),但在大量数据时,额外的查找成本会显现出来。
    • 适用于只操作键,或少量数据情况下访问键值对。
  3. values()

    • 性能与 entrySet() 类似,但只能访问值,适用于只关心值的场景。
    • 如果需要同时访问键和值,values() 并不合适。
4.2 适用场景
  • entrySet():适用于需要同时访问键和值的场景,特别是当需要进行复杂操作或修改时。
  • keySet():适用于只需要遍历键,或根据键执行操作的场景。
  • values():适用于只关心值的场景,键的存在无关紧要。

5. 其他遍历方式(基于Java 8 Stream API)

在Java 8引入的Stream API提供了更加灵活的遍历方式,结合Lambda表达式,可以简化代码的编写。下面是使用Stream API遍历HashMap的示例:

import java.util.HashMap;
import java.util.Map;

public class HashMapStreamExample {

    public static void main(String[] args) {
        HashMap<String, Integer> map = new HashMap<>();
        map.put("Alice", 30);
        map.put("Bob", 25);
        map.put("Charlie", 35);

        // 使用Stream API遍历entrySet()
        map.entrySet().stream()
                .forEach(entry -> System.out.println("Key: " + entry.getKey() + ", Value: " + entry.getValue()));

        // 使用Stream API遍历keySet()
        map.keySet().stream()
                .forEach(key -> System.out.println("Key: " + key + ", Value: " + map.get(key)));

        // 使用Stream API遍历values()
        map.values().stream()
                .forEach(value -> System.out.println("Value: " + value));
    }
}

6. 总结

在Java中遍历HashMap有多种方式,最常用的三种方法是使用entrySet()keySet()values()。根据具体的需求和场景选择合适的遍历方式,可以有效提高代码的可读性和性能:

  • entrySet():最通用的遍历方式,适用于需要同时访问键和值的场景。
  • keySet():适用于只关心键或基于键来操作的场景。
  • values():适用于只关心值的场景,代码简洁明

标签:map,遍历,hashmap,entrySet,keySet,三种,values,HashMap
From: https://blog.csdn.net/Flying_Fish_roe/article/details/144007772

相关文章

  • ConcurrentHashmap 锁
    1.ConcurrentHashMap的基本原理1.1ConcurrentHashMap的结构ConcurrentHashMap是一种线程安全的哈希表。它通过将数据分成多个段(在Java8之前)或桶(Java8之后),使得多个线程可以并发地访问不同的部分,从而减少了锁争用,提高了并发性能。Java7及之前的实现:Concurrent......
  • 学习笔记(四十三):@BuilderParam装饰器初始化组件的三种方式
    一、参数初始化组件@BuilderParam装饰的方法可以是有参数和无参数的两种形式,需与指向的@Builder方法类型匹配1、定义一个类作为参数//定义一个对象,ui需要的数据exportclassViewEntity{content:string="sssss";}2、定义一个自定义组件import{ViewEntity}from......
  • 三种排列 dp 的比较
    三种排列dp的比较Permutation有一个长为NNN的正整数排列。给定一个由<和>组成长为N−......
  • 常见排序算法总结(一) - 三种基本排序
    排序算法的稳定性稳定性是指,在算法思想不改变的前提下,能否给出一种实现,保证对任意待排序列中值相同的两个元素,在排序之后保持相对位置不变。因此稳定性是和可以和具体实现无关的,对于某一种算法,只要有不改变相对顺序的实现方案存在,它就具有稳定性。强调值相同,是因为在数值......
  • 二叉树的中序遍历
    给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。示例1:输入:root=[1,null,2,3]输出:[1,3,2]示例2:输入:root=[]输出:[]示例3:输入:root=[1]输出:[1]提示:树中节点数目在范围 [0,100] 内-100<=Node.val<=100进阶: 递归算法很简单,你可以通......
  • Java-三种线程的实现方式
    1.继承Thread类可以通过创建一个新的类继承Thread类,并重写其run方法来实现线程。classMyThreadextendsThread{@Overridepublicvoidrun(){System.out.println("线程运行中:"+Thread.currentThread().getName());//线程要执行的代码......
  • 大厂面试真题-说说jdk1.7和1.8的hashmap的区别以及各自的问题
    JDK1.7和JDK1.8中的HashMap存在显著的区别,并且各自存在一些问题。以下是对两者的详细对比及问题分析:一、区别底层数据结构:JDK1.7:HashMap的底层结构是由数组(也被称为“位桶”)和链表构成。当hash冲突时,不同的key映射到数组的同一位置,则形成链表。JDK1.8:HashMap的底层结构......
  • 岛屿数量(深度优先遍历)
    给你一个由 '1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量。岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。此外,你可以假设该网格的四条边均被水包围。示例1:输入:grid=[["1","1","1","1","0"],["1","1",&qu......
  • C语言手撕实战代码_线索二叉树_先序中序线索二叉树_树的先根遍历_后根遍历_树的度_孩
    文章目录1.设计算法构造一棵先序线索二叉树2.先序线索二叉树的先序遍历算法3.设计算法构造一棵中序线索二叉树4.遍历中序线索二叉树5.树的先根遍历和后根遍历6.树T的叶子结点个数7.计算一棵以孩子兄弟表示的树T的度,该算法的时间复杂度为O(n)8.计算树孩子兄弟链表表示的T......
  • C语言-用指针遍历二维数组
    一、1.用一级指针遍历二维数组7#include<stdio.h>89intmain(intargc,char*argv[])10{11inta[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};12int*p;13p=*a;14inti;15for(i=0;i<12;i++){16if(i!=0&&i%4==0)17......