在Java中遍历HashMap


在Java中,遍历HashMap有多种方法。让我们来看看最常见的几种方法,以及它们的优缺点。由于所有的Map都实现了Map接口,下面的技术对于任何的Map实现(HashMap、TreeMap、LinkedHashMap、Hashtable等)都适用。

方法1:使用For-Each循环遍历entrySet

这是最常见的方法,在大多数情况下都是首选。如果在循环中需要同时使用Map的键和值,请使用这种方法。

1Map<Integer, Integer> map = new HashMap<Integer, Integer>();
2for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
3    System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue());
4}

需要注意的是,For-Each循环是从Java 5版本引入的,所以只适用于较新的版本。此外,如果尝试对一个null的Map进行迭代,For-Each循环会抛出NullPointerException异常,因此在进行迭代之前应该始终检查null引用的情况。

方法2:使用For-Each循环遍历keySet或values

如果只需要Map的键或值,可以使用keySet或values方法进行迭代。

 1Map<Integer, Integer> map = new HashMap<Integer, Integer>();
 2
 3// 只迭代键
 4for (Integer key : map.keySet()) {
 5    System.out.println("Key = " + key);
 6}
 7
 8// 只迭代值
 9for (Integer value : map.values()) {
10    System.out.println("Value = " + value);
11}

这种方法相较于entrySet迭代略微提升了性能(大约快了10%),并且更简洁。

方法3:使用Iterator进行迭代

在这种方法中,使用Iterator来进行迭代。使用泛型:

1Map<Integer, Integer> map = new HashMap<Integer, Integer>();
2Iterator<Map.Entry<Integer, Integer>> entries = map.entrySet().iterator();
3while (entries.hasNext()) {
4    Map.Entry<Integer, Integer> entry = entries.next();
5    System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue());
6}

不适用泛型的写法:

1Map map = new HashMap();
2Iterator entries = map.entrySet().iterator();
3while (entries.hasNext()) {
4    Map.Entry entry = (Map.Entry) entries.next();
5    Integer key = (Integer)entry.getKey();
6    Integer value = (Integer)entry.getValue();
7    System.out.println("Key = " + key + ", Value = " + value);
8}

此方法具备独有的优势。首先,它是在较旧版本的Java中进行迭代的唯一方法。其次,它是唯一一种允许在迭代过程中通过调用iterator.remove()删除条目的方法。如果您在For-Each循环中尝试这样做,将会得到“不可预测的结果”的警告。从性能的角度来看,该方法和For-Each循环具有相同的性能。

方法4:遍历键并查找值(不推荐)

这种方法在代码上看起来较简洁,但实际上效率很低。通过键获取值可能需要较长时间,因此不推荐使用该方法(与方法1相比,在不同的Map实现中,该方法的性能较其慢20%至200%)。如果使用了FindBugs,它会检测到这种情况并警告您进行低效的迭代。应该避免使用这种方法。

总结

  • 如果只需要键或值,使用方法2;
  • 如果受限于较旧的Java版本(小于5)或需要在迭代过程中删除条目,请使用方法3;
  • 否则,请使用方法1。

这些方法提供了在Java中遍历HashMap的多种方式,根据具体的需求和使用情景进行选择。


相关文章推荐