跳转至

Java 中遍历 HashMap 的全面指南

简介

在 Java 编程里,HashMap 是一个极为常用的数据结构,它以键值对(key-value pairs)的形式存储数据。而对 HashMap 进行遍历操作,也就是依次访问其中的每个键值对,是日常编程中频繁会遇到的需求。本文将深入介绍 Java 中遍历 HashMap 的基础概念、使用方法、常见实践以及最佳实践,助力读者深入理解并高效运用这一操作。

目录

  1. 基础概念
  2. 使用方法
    • 使用 Iterator 遍历键
    • 使用 Iterator 遍历键值对
    • 使用 for-each 循环遍历键值对
    • 使用 Java 8 的 forEach 方法
  3. 常见实践
    • 查找特定值对应的键
    • 计算所有值的总和
  4. 最佳实践
    • 根据不同场景选择合适的遍历方式
    • 避免在遍历过程中修改 HashMap
  5. 小结
  6. 参考资料

基础概念

HashMap 是 Java 集合框架中的一员,它继承自 AbstractMap 类并实现了 Map 接口。HashMap 利用哈希表来存储键值对,键具有唯一性,值可以重复。在遍历 HashMap 时,本质上就是按照某种顺序逐个访问其中的键值对。由于 HashMap 不保证元素的顺序,所以遍历结果的顺序是不确定的。

使用方法

使用 Iterator 遍历键

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

public class IterateHashMapByKey {
    public static void main(String[] args) {
        Map<String, Integer> map = new HashMap<>();
        map.put("apple", 1);
        map.put("banana", 2);
        map.put("cherry", 3);

        Iterator<String> keyIterator = map.keySet().iterator();
        while (keyIterator.hasNext()) {
            String key = keyIterator.next();
            System.out.println("Key: " + key + ", Value: " + map.get(key));
        }
    }
}

使用 Iterator 遍历键值对

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

public class IterateHashMapByEntry {
    public static void main(String[] args) {
        Map<String, Integer> map = new HashMap<>();
        map.put("apple", 1);
        map.put("banana", 2);
        map.put("cherry", 3);

        Iterator<Map.Entry<String, Integer>> entryIterator = map.entrySet().iterator();
        while (entryIterator.hasNext()) {
            Map.Entry<String, Integer> entry = entryIterator.next();
            System.out.println("Key: " + entry.getKey() + ", Value: " + entry.getValue());
        }
    }
}

使用 for-each 循环遍历键值对

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

public class IterateHashMapForEach {
    public static void main(String[] args) {
        Map<String, Integer> map = new HashMap<>();
        map.put("apple", 1);
        map.put("banana", 2);
        map.put("cherry", 3);

        for (Map.Entry<String, Integer> entry : map.entrySet()) {
            System.out.println("Key: " + entry.getKey() + ", Value: " + entry.getValue());
        }
    }
}

使用 Java 8 的 forEach 方法

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

public class IterateHashMapJava8 {
    public static void main(String[] args) {
        Map<String, Integer> map = new HashMap<>();
        map.put("apple", 1);
        map.put("banana", 2);
        map.put("cherry", 3);

        map.forEach((key, value) -> System.out.println("Key: " + key + ", Value: " + value));
    }
}

常见实践

查找特定值对应的键

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

public class FindKeyByValue {
    public static void main(String[] args) {
        Map<String, Integer> map = new HashMap<>();
        map.put("apple", 1);
        map.put("banana", 2);
        map.put("cherry", 3);

        int targetValue = 2;
        for (Map.Entry<String, Integer> entry : map.entrySet()) {
            if (entry.getValue() == targetValue) {
                System.out.println("Key for value " + targetValue + " is: " + entry.getKey());
                break;
            }
        }
    }
}

计算所有值的总和

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

public class CalculateValueSum {
    public static void main(String[] args) {
        Map<String, Integer> map = new HashMap<>();
        map.put("apple", 1);
        map.put("banana", 2);
        map.put("cherry", 3);

        int sum = 0;
        for (Map.Entry<String, Integer> entry : map.entrySet()) {
            sum += entry.getValue();
        }
        System.out.println("Sum of all values: " + sum);
    }
}

最佳实践

根据不同场景选择合适的遍历方式

  • 若仅需访问键,使用 keySet() 结合 Iteratorfor-each 循环。
  • 若需同时访问键和值,使用 entrySet() 结合 Iteratorfor-each 循环或 Java 8 的 forEach 方法。
  • 若代码运行在 Java 8 及以上版本,且需要简洁的代码,优先使用 forEach 方法。

避免在遍历过程中修改 HashMap

在使用 Iterator 遍历 HashMap 时,若需要删除元素,应使用 Iteratorremove() 方法,否则会抛出 ConcurrentModificationException 异常。

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

public class RemoveElementDuringIteration {
    public static void main(String[] args) {
        Map<String, Integer> map = new HashMap<>();
        map.put("apple", 1);
        map.put("banana", 2);
        map.put("cherry", 3);

        Iterator<Map.Entry<String, Integer>> iterator = map.entrySet().iterator();
        while (iterator.hasNext()) {
            Map.Entry<String, Integer> entry = iterator.next();
            if (entry.getValue() == 2) {
                iterator.remove();
            }
        }
        System.out.println(map);
    }
}

小结

本文详细介绍了 Java 中遍历 HashMap 的多种方法,包括使用 Iteratorfor-each 循环和 Java 8 的 forEach 方法。同时,给出了常见实践和最佳实践的示例。在实际编程中,应根据具体需求选择合适的遍历方式,并注意避免在遍历过程中对 HashMap 进行不当修改。

参考资料

  • 《Effective Java》,作者:Joshua Bloch