我在 HashMap 中有一个结构,我需要遍历一个for
. 我该如何做这个迭代?
我的代码:
import java.util.HashMap;
import java.util.Map;
public class Testeo {
public static void main(String[] args) {
Map<Integer, String> datos = new HashMap<>();
datos.put(1, "uno");
datos.put(2, "dos");
datos.put(3, "tres");
//necesito iterar aquí
}
}
如果您使用的是 Java 8,则可以利用 lambda 表达式来编写紧凑的代码:
无需使用,和
EntrySet
的数据类型会自动推断。k
v
没有办法直接迭代 HashMap,但你可以迭代它。
entrySet()
例如:
资料来源:Jesper的Stack Overflow
参考链接:How to Iterate Over a Map in Java
有几种方法可以在 java 中迭代地图。我们将看到最常用的方法并回顾它们的优缺点。由于 java 中的所有映射都实现了接口
Map
,因此以下技术适用于Map
(HashMap
,TreeMap
,LinkedHashMap
,Hashtable
等)的任何实现方法 #1:使用 For-Each 对输入进行迭代。
在大多数情况下,它是最常见和最可取的。它将在您需要值和键的情况下使用。
请注意,Java 5 中引入了 For-Each 循环,因此它仅适用于早期版本的 java。如果您尝试在地图上进行迭代,循环
For-Each
也会抛出,因此请始终首先检查引用。NullPointerException
nulo
nulas
方法#2:使用 For-Each 循环对键或值进行迭代。
如果您只需要键或值,您可以使用
keySet
orvalues
代替entrySet
.这种方法比迭代有轻微的性能优势
entrySet
(大约快 10%)并且更干净。方法 #3:使用
Iterator
.使用泛型:
没有泛型:
您也可以使用相同的技术来迭代
keySet
或values
。这种方法可能看起来多余,但它有它的优点。首先,它是在旧版本的 java 中迭代映射的唯一方法。另一个重要特性是,这是唯一允许您在迭代期间使用
iterator.remove()
. 如果您尝试使用 For-Each 迭代来执行此操作,您将根据 JavaDoc 获得“不可预测的结果”。从性能的角度来看,这与 For-Each 迭代相同。
方法#4:遍历键并寻找值(低效)。
这似乎是方法 #1 的更清洁的替代方案,但实际上它非常缓慢且效率低下,通过键获取值可能非常耗时(这种方法在不同的实现中
Map
比方法 #1 慢 20%-200% )。如果您安装了FindBugs,它会检测到它并警告您迭代效率低下。应该避免这种方法。结论:
如果您只想要键或值,请使用方法#2。如果您卡在某个旧版本的 java(少于 5 个)或计划在迭代期间删除条目,请使用方法 #3。否则使用#1。
该接口
Map
(由 实现HashMap
)具有一个entrySet()方法,该方法将 Map 的视图返回为Set
。这些Set
是可迭代的:请注意,
Set
返回的entrySet()
不是副本。它得到它的支持,Map
因此对其中一个所做的所有更改都会影响另一个。这也意味着,在多线程应用程序的情况下,您必须小心不要以这种方式修改
Map
while 迭代Set
。也可以
java.util.Map
在keySet
. _ 此方法返回 的实例java.util.Set
,它是地图的视图。对其进行任何更改都会影响地图。代码:
输出:
在我看来,很多时候下面的代码更直观实用: