如何有效地迭代Java Map中的每个条目?

如何有效地迭代Java Map中的每个条目?

如果我有一个Map用Java 实现接口的对象,并希望迭代其中包含的每一对,那么通过地图的最有效方法是什么?

元素的排序是否取决于我对界面的具体映射实现?


人到中年有点甜
浏览 1114回答 4
4回答

繁星淼淼

Map<String,&nbsp;String>&nbsp;map&nbsp;=&nbsp;...for&nbsp;(Map.Entry<String,&nbsp;String>&nbsp;entry&nbsp;:&nbsp;map.entrySet())&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;System.out.println(entry.getKey()&nbsp;+&nbsp;"/"&nbsp;+&nbsp;entry.getValue());}

翻翻过去那场雪

为了总结其他答案并将它们与我所知道的结合起来,我找到了10种主要方法(见下文)。另外,我写了一些性能测试(见下面的结果)。例如,如果我们想要找到地图的所有键和值的总和,我们可以写:使用iterator和Map.Entrylong&nbsp;i&nbsp;=&nbsp;0;Iterator<Map.Entry<Integer,&nbsp;Integer>>&nbsp;it&nbsp;=&nbsp;map.entrySet().iterator();while&nbsp;(it.hasNext())&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;Map.Entry<Integer,&nbsp;Integer>&nbsp;pair&nbsp;=&nbsp;it.next(); &nbsp;&nbsp;&nbsp;&nbsp;i&nbsp;+=&nbsp;pair.getKey()&nbsp;+&nbsp;pair.getValue();}使用foreach和Map.Entrylong&nbsp;i&nbsp;=&nbsp;0;for&nbsp;(Map.Entry<Integer,&nbsp;Integer>&nbsp;pair&nbsp;:&nbsp;map.entrySet())&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;i&nbsp;+=&nbsp;pair.getKey()&nbsp;+&nbsp;pair.getValue();}使用Java 8中的forEachfinal&nbsp;long[]&nbsp;i&nbsp;=&nbsp;{0};map.forEach((k,&nbsp;v)&nbsp;->&nbsp;i[0]&nbsp;+=&nbsp;k&nbsp;+&nbsp;v);使用keySet和foreachlong&nbsp;i&nbsp;=&nbsp;0;for&nbsp;(Integer&nbsp;key&nbsp;:&nbsp;map.keySet())&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;i&nbsp;+=&nbsp;key&nbsp;+&nbsp;map.get(key);}使用keySet和iteratorlong&nbsp;i&nbsp;=&nbsp;0;Iterator<Integer>&nbsp;itr2&nbsp;=&nbsp;map.keySet().iterator();while&nbsp;(itr2.hasNext())&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;Integer&nbsp;key&nbsp;=&nbsp;itr2.next(); &nbsp;&nbsp;&nbsp;&nbsp;i&nbsp;+=&nbsp;key&nbsp;+&nbsp;map.get(key);}使用for和Map.Entrylong&nbsp;i&nbsp;=&nbsp;0;for&nbsp;(Iterator<Map.Entry<Integer,&nbsp;Integer>>&nbsp;entries&nbsp;=&nbsp;map.entrySet().iterator();&nbsp;entries.hasNext();&nbsp;)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;Map.Entry<Integer,&nbsp;Integer>&nbsp;entry&nbsp;=&nbsp;entries.next(); &nbsp;&nbsp;&nbsp;&nbsp;i&nbsp;+=&nbsp;entry.getKey()&nbsp;+&nbsp;entry.getValue();}使用Java 8&nbsp;Stream APIfinal&nbsp;long[]&nbsp;i&nbsp;=&nbsp;{0};map.entrySet().stream().forEach(e&nbsp;->&nbsp;i[0]&nbsp;+=&nbsp;e.getKey()&nbsp;+&nbsp;e.getValue());使用Java 8&nbsp;Stream API并行final&nbsp;long[]&nbsp;i&nbsp;=&nbsp;{0};map.entrySet().stream().parallel().forEach(e&nbsp;->&nbsp;i[0]&nbsp;+=&nbsp;e.getKey()&nbsp;+&nbsp;e.getValue());使用IterableMap的Apache Collectionslong&nbsp;i&nbsp;=&nbsp;0;MapIterator<Integer,&nbsp;Integer>&nbsp;it&nbsp;=&nbsp;iterableMap.mapIterator();while&nbsp;(it.hasNext())&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;i&nbsp;+=&nbsp;it.next()&nbsp;+&nbsp;it.getValue();}使用Eclipse(CS)集合的MutableMapfinal&nbsp;long[]&nbsp;i&nbsp;=&nbsp;{0};mutableMap.forEachKeyValue((key,&nbsp;value)&nbsp;->&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;i[0]&nbsp;+=&nbsp;key&nbsp;+&nbsp;value;});性能测试(模式= AverageTime,system = Windows 8.1 64位,Intel i7-4790 3.60 GHz,16 GB)对于小地图(100个元素),得分0.308是最好的Benchmark&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Mode&nbsp;&nbsp;Cnt&nbsp;&nbsp;Score&nbsp;&nbsp;&nbsp;&nbsp;Error&nbsp;&nbsp;Unitstest3_UsingForEachAndJava8 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;avgt&nbsp;&nbsp;10&nbsp;&nbsp;&nbsp;0.308&nbsp;±&nbsp;&nbsp;0.021&nbsp;&nbsp;µs/op test10_UsingEclipseMap&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;avgt&nbsp;&nbsp;10&nbsp;&nbsp;&nbsp;0.309&nbsp;±&nbsp;&nbsp;0.009&nbsp;&nbsp;µs/op test1_UsingWhileAndMapEntry&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;avgt&nbsp;&nbsp;10&nbsp;&nbsp;&nbsp;0.380&nbsp;±&nbsp;&nbsp;0.014&nbsp;&nbsp;µs/op test6_UsingForAndIterator&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;avgt&nbsp;&nbsp;10&nbsp;&nbsp;&nbsp;0.387&nbsp;±&nbsp;&nbsp;0.016&nbsp;&nbsp;µs/op test2_UsingForEachAndMapEntry&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;avgt&nbsp;&nbsp;10&nbsp;&nbsp;&nbsp;0.391&nbsp;±&nbsp;&nbsp;0.023&nbsp;&nbsp;µs/op test7_UsingJava8StreamApi&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;avgt&nbsp;&nbsp;10&nbsp;&nbsp;&nbsp;0.510&nbsp;±&nbsp;&nbsp;0.014&nbsp;&nbsp;µs/op test9_UsingApacheIterableMap&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;avgt&nbsp;&nbsp;10&nbsp;&nbsp;&nbsp;0.524&nbsp;±&nbsp;&nbsp;0.008&nbsp;&nbsp;µs/op test4_UsingKeySetAndForEach&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;avgt&nbsp;&nbsp;10&nbsp;&nbsp;&nbsp;0.816&nbsp;±&nbsp;&nbsp;0.026&nbsp;&nbsp;µs/op test5_UsingKeySetAndIterator&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;avgt&nbsp;&nbsp;10&nbsp;&nbsp;&nbsp;0.863&nbsp;±&nbsp;&nbsp;0.025&nbsp;&nbsp;µs/op test8_UsingJava8StreamApiParallel&nbsp;&nbsp;avgt&nbsp;&nbsp;10&nbsp;&nbsp;&nbsp;5.552&nbsp;±&nbsp;&nbsp;0.185&nbsp;&nbsp;µs/op对于10000个元素的地图,得分37.606是最好的Benchmark&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Mode&nbsp;&nbsp;&nbsp;Cnt&nbsp;&nbsp;Score&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Error&nbsp;&nbsp;&nbsp;Unitstest10_UsingEclipseMap &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;avgt&nbsp;&nbsp;&nbsp;10&nbsp;&nbsp;&nbsp;&nbsp;37.606&nbsp;±&nbsp;&nbsp;&nbsp;0.790&nbsp;&nbsp;µs/op test3_UsingForEachAndJava8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;avgt&nbsp;&nbsp;&nbsp;10&nbsp;&nbsp;&nbsp;&nbsp;50.368&nbsp;±&nbsp;&nbsp;&nbsp;0.887&nbsp;&nbsp;µs/op test6_UsingForAndIterator&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;avgt&nbsp;&nbsp;&nbsp;10&nbsp;&nbsp;&nbsp;&nbsp;50.332&nbsp;±&nbsp;&nbsp;&nbsp;0.507&nbsp;&nbsp;µs/op test2_UsingForEachAndMapEntry&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;avgt&nbsp;&nbsp;&nbsp;10&nbsp;&nbsp;&nbsp;&nbsp;51.406&nbsp;±&nbsp;&nbsp;&nbsp;1.032&nbsp;&nbsp;µs/op test1_UsingWhileAndMapEntry&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;avgt&nbsp;&nbsp;&nbsp;10&nbsp;&nbsp;&nbsp;&nbsp;52.538&nbsp;±&nbsp;&nbsp;&nbsp;2.431&nbsp;&nbsp;µs/op test7_UsingJava8StreamApi&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;avgt&nbsp;&nbsp;&nbsp;10&nbsp;&nbsp;&nbsp;&nbsp;54.464&nbsp;±&nbsp;&nbsp;&nbsp;0.712&nbsp;&nbsp;µs/op test4_UsingKeySetAndForEach&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;avgt&nbsp;&nbsp;&nbsp;10&nbsp;&nbsp;&nbsp;&nbsp;79.016&nbsp;±&nbsp;&nbsp;25.345&nbsp;&nbsp;µs/op test5_UsingKeySetAndIterator&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;avgt&nbsp;&nbsp;&nbsp;10&nbsp;&nbsp;&nbsp;&nbsp;91.105&nbsp;±&nbsp;&nbsp;10.220&nbsp;&nbsp;µs/op test8_UsingJava8StreamApiParallel&nbsp;&nbsp;&nbsp;avgt&nbsp;&nbsp;&nbsp;10&nbsp;&nbsp;&nbsp;112.511&nbsp;±&nbsp;&nbsp;&nbsp;0.365&nbsp;&nbsp;µs/op test9_UsingApacheIterableMap&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;avgt&nbsp;&nbsp;&nbsp;10&nbsp;&nbsp;&nbsp;125.714&nbsp;±&nbsp;&nbsp;&nbsp;1.935&nbsp;&nbsp;µs/op对于具有100000个元素的地图,得分1184.767是最好的Benchmark&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Mode&nbsp;&nbsp;&nbsp;Cnt&nbsp;&nbsp;Score&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Error&nbsp;&nbsp;&nbsp;&nbsp;Unitstest1_UsingWhileAndMapEntry&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; avgt&nbsp;&nbsp;&nbsp;10&nbsp;&nbsp;&nbsp;1184.767&nbsp;±&nbsp;&nbsp;&nbsp;332.968&nbsp;&nbsp;µs/op test10_UsingEclipseMap&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;avgt&nbsp;&nbsp;&nbsp;10&nbsp;&nbsp;&nbsp;1191.735&nbsp;±&nbsp;&nbsp;&nbsp;304.273&nbsp;&nbsp;µs/op test2_UsingForEachAndMapEntry&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;avgt&nbsp;&nbsp;&nbsp;10&nbsp;&nbsp;&nbsp;1205.815&nbsp;±&nbsp;&nbsp;&nbsp;366.043&nbsp;&nbsp;µs/op test6_UsingForAndIterator&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;avgt&nbsp;&nbsp;&nbsp;10&nbsp;&nbsp;&nbsp;1206.873&nbsp;±&nbsp;&nbsp;&nbsp;367.272&nbsp;&nbsp;µs/op test8_UsingJava8StreamApiParallel&nbsp;&nbsp;avgt&nbsp;&nbsp;&nbsp;10&nbsp;&nbsp;&nbsp;1485.895&nbsp;±&nbsp;&nbsp;&nbsp;233.143&nbsp;&nbsp;µs/op test5_UsingKeySetAndIterator&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;avgt&nbsp;&nbsp;&nbsp;10&nbsp;&nbsp;&nbsp;1540.281&nbsp;±&nbsp;&nbsp;&nbsp;357.497&nbsp;&nbsp;µs/op test4_UsingKeySetAndForEach&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;avgt&nbsp;&nbsp;&nbsp;10&nbsp;&nbsp;&nbsp;1593.342&nbsp;±&nbsp;&nbsp;&nbsp;294.417&nbsp;&nbsp;µs/op test3_UsingForEachAndJava8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;avgt&nbsp;&nbsp;&nbsp;10&nbsp;&nbsp;&nbsp;1666.296&nbsp;±&nbsp;&nbsp;&nbsp;126.443&nbsp;&nbsp;µs/op test7_UsingJava8StreamApi&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;avgt&nbsp;&nbsp;&nbsp;10&nbsp;&nbsp;&nbsp;1706.676&nbsp;±&nbsp;&nbsp;&nbsp;436.867&nbsp;&nbsp;µs/op test9_UsingApacheIterableMap&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;avgt&nbsp;&nbsp;&nbsp;10&nbsp;&nbsp;&nbsp;3289.866&nbsp;±&nbsp;&nbsp;1445.564&nbsp;&nbsp;µs/op图表(性能测试取决于地图大小)表(性能测试取决于地图大小)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 100&nbsp; &nbsp; &nbsp;600&nbsp; &nbsp; &nbsp; 1100&nbsp; &nbsp; &nbsp;1600&nbsp; &nbsp; &nbsp;2100test10&nbsp; &nbsp; 0.333&nbsp; &nbsp; 1.631&nbsp; &nbsp; 2.752&nbsp; &nbsp; 5.937&nbsp; &nbsp; 8.024test3&nbsp; &nbsp; &nbsp;0.309&nbsp; &nbsp; 1.971&nbsp; &nbsp; 4.147&nbsp; &nbsp; 8.147&nbsp; &nbsp;10.473test6&nbsp; &nbsp; &nbsp;0.372&nbsp; &nbsp; 2.190&nbsp; &nbsp; 4.470&nbsp; &nbsp; 8.322&nbsp; &nbsp;10.531test1&nbsp; &nbsp; &nbsp;0.405&nbsp; &nbsp; 2.237&nbsp; &nbsp; 4.616&nbsp; &nbsp; 8.645&nbsp; &nbsp;10.707test2&nbsp; &nbsp; &nbsp;0.376&nbsp; &nbsp; 2.267&nbsp; &nbsp; 4.809&nbsp; &nbsp; 8.403&nbsp; &nbsp;10.910test7&nbsp; &nbsp; &nbsp;0.473&nbsp; &nbsp; 2.448&nbsp; &nbsp; 5.668&nbsp; &nbsp; 9.790&nbsp; &nbsp;12.125test9&nbsp; &nbsp; &nbsp;0.565&nbsp; &nbsp; 2.830&nbsp; &nbsp; 5.952&nbsp; &nbsp;13.220&nbsp; &nbsp;16.965test4&nbsp; &nbsp; &nbsp;0.808&nbsp; &nbsp; 5.012&nbsp; &nbsp; 8.813&nbsp; &nbsp;13.939&nbsp; &nbsp;17.407test5&nbsp; &nbsp; &nbsp;0.810&nbsp; &nbsp; 5.104&nbsp; &nbsp; 8.533&nbsp; &nbsp;14.064&nbsp; &nbsp;17.422test8&nbsp; &nbsp; &nbsp;5.173&nbsp; &nbsp;12.499&nbsp; &nbsp;17.351&nbsp; &nbsp;24.671&nbsp; &nbsp;30.403所有测试都在GitHub上。

RISEBY

在Java 8中,您可以使用新的lambdas功能清洁和快速地执行此操作:&nbsp;Map<String,String>&nbsp;map&nbsp;=&nbsp;new&nbsp;HashMap<>(); &nbsp;map.put("SomeKey",&nbsp;"SomeValue"); &nbsp;map.forEach(&nbsp;(k,v)&nbsp;->&nbsp;[do&nbsp;something&nbsp;with&nbsp;key&nbsp;and&nbsp;value]&nbsp;); &nbsp;//&nbsp;such&nbsp;as &nbsp;map.forEach(&nbsp;(k,v)&nbsp;->&nbsp;System.out.println("Key:&nbsp;"&nbsp;+&nbsp;k&nbsp;+&nbsp;":&nbsp;Value:&nbsp;"&nbsp;+&nbsp;v));类型k和v将由编译器推断,不再需要使用Map.Entry。十分简单!
打开App,查看更多内容
随时随地看视频慕课网APP