您好,登錄后才能下訂單哦!
本篇內(nèi)容介紹了“怎么使用HashMap的循環(huán)”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
先來(lái)看看每種遍歷的方式:
在for循環(huán)中使用entries實(shí)現(xiàn)Map的遍歷
public static void forEachEntries() { for (Map.Entry<String, String> entry : map.entrySet()) { String mapKey = entry.getKey(); String mapValue = entry.getValue(); } }
在for循環(huán)中遍歷key
public static void forEachKey() { for (String key : map.keySet()) { String mapKey = key; String mapValue = map.get(mapKey); } }
在for循環(huán)中遍歷value
public static void forEachValues() { for (String key : map.values()) { String val = key; } }
Iterator遍歷
public static void forEachIterator() { Iterator<Entry<String, String>> entries = map.entrySet().iterator(); while (entries.hasNext()) { Entry<String, String> entry = entries.next(); String key = entry.getKey(); String value = entry.getValue(); } }
forEach jdk1.8遍歷
public static void forEach() { map.forEach((key, val) -> { String key1 = key; String value = val; }); }
Stream jdk1.8遍歷
map.entrySet().stream().forEach((entry) -> { String key = entry.getKey(); String value = entry.getValue(); });
Streamparallel jdk1.8遍歷
public static void forEachStreamparallel() { map.entrySet().parallelStream().forEach((entry) -> { String key = entry.getKey(); String value = entry.getValue(); }); }
以上就是常見(jiàn)的對(duì)于map的一些遍歷的方式,下面我們來(lái)寫個(gè)測(cè)試用例來(lái)看下這些遍歷方式,哪些是效率最好的。下面測(cè)試用例是基于JMH來(lái)測(cè)試的 首先引入pom
<dependency> <groupId>org.openjdk.jmh</groupId> <artifactId>jmh-core</artifactId> <version>1.23</version> </dependency> <dependency> <groupId>org.openjdk.jmh</groupId> <artifactId>jmh-generator-annprocess</artifactId> <version>1.23</version> <scope>provided</scope> </dependency>
關(guān)于jmh測(cè)試如可能會(huì)影響結(jié)果的一些因素這里就不詳細(xì)介紹了,可以參考文末的第一個(gè)鏈接寫的非常詳細(xì)。以及測(cè)試用例為什么要這么寫(都是為了消除JIT對(duì)測(cè)試代碼的影響)這是參照官網(wǎng)的鏈接:編寫測(cè)試代碼如下:
package com.workit.autoconfigure.autoconfigure.controller; import org.openjdk.jmh.annotations.*; import org.openjdk.jmh.infra.Blackhole; import org.openjdk.jmh.results.format.ResultFormatType; import org.openjdk.jmh.runner.Runner; import org.openjdk.jmh.runner.RunnerException; import org.openjdk.jmh.runner.options.Options; import org.openjdk.jmh.runner.options.OptionsBuilder; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Map.Entry; import java.util.UUID; import java.util.concurrent.TimeUnit; /** * @author:公眾號(hào):java金融 * @Date: * @Description:微信搜一搜【java金融】回復(fù)666 */ @State(Scope.Thread) @Warmup(iterations = 5, time = 1, timeUnit = TimeUnit.SECONDS) @Measurement(iterations = 5, time = 1, timeUnit = TimeUnit.SECONDS) @Fork(1) @BenchmarkMode(Mode.AverageTime) @OutputTimeUnit(TimeUnit.NANOSECONDS) public class InstructionsBenchmark { public static void main(String[] args) throws RunnerException { Options opt = new OptionsBuilder().include(InstructionsBenchmark.class.getSimpleName()).result("result.json").resultFormat(ResultFormatType.JSON).build(); new Runner(opt).run(); } static final int BASE = 42; static int add(int key,int val) { return BASE + key +val; } @Param({"1", "10", "100", "1000","10000","100000"}) int size; private static Map<Integer, Integer> map; // 初始化方法,在全部Benchmark運(yùn)行之前進(jìn)行 @Setup(Level.Trial) public void init() { map = new HashMap<>(size); for (int i = 0; i < size; i++) { map.put(i, i); } } /** * 在for循環(huán)中使用entries實(shí)現(xiàn)Map的遍歷: */ @Benchmark public static void forEachEntries(Blackhole blackhole) { for (Map.Entry<Integer, Integer> entry : map.entrySet()) { Integer mapKey = entry.getKey(); Integer mapValue = entry.getValue(); blackhole.consume(add(mapKey,mapValue)); } } /** * 在for循環(huán)中遍歷key */ @Benchmark public static StringBuffer forEachKey(Blackhole blackhole) { StringBuffer stringBuffer = new StringBuffer(); for (Integer key : map.keySet()) { // Integer mapValue = map.get(key); blackhole.consume(add(key,key)); } return stringBuffer; } /** * 在for循環(huán)中遍歷value */ @Benchmark public static void forEachValues(Blackhole blackhole) { for (Integer key : map.values()) { blackhole.consume(add(key,key)); } } /** * Iterator遍歷; */ @Benchmark public static void forEachIterator(Blackhole blackhole) { Iterator<Entry<Integer, Integer>> entries = map.entrySet().iterator(); while (entries.hasNext()) { Entry<Integer, Integer> entry = entries.next(); Integer key = entry.getKey(); Integer value = entry.getValue(); blackhole.consume(add(key,value)); } } /** * forEach jdk1.8遍歷 */ @Benchmark public static void forEachLamada(Blackhole blackhole) { map.forEach((key, value) -> { blackhole.consume(add(key,value)); }); } /** * forEach jdk1.8遍歷 */ @Benchmark public static void forEachStream(Blackhole blackhole) { map.entrySet().stream().forEach((entry) -> { Integer key = entry.getKey(); Integer value = entry.getValue(); blackhole.consume(add(key,value)); }); } @Benchmark public static void forEachStreamparallel(Blackhole blackhole) { map.entrySet().parallelStream().forEach((entry) -> { Integer key = entry.getKey(); Integer value = entry.getValue(); blackhole.consume(add(key,value)); }); } }
運(yùn)行結(jié)果如下:「注:運(yùn)行環(huán)境idea 2019.3,jdk1.8,windows7 64位?!?/p>
Benchmark (size) Mode Cnt Score Error Units InstructionsBenchmark.forEachEntries 1 avgt 5 10.021 ± 0.224 ns/op InstructionsBenchmark.forEachEntries 10 avgt 5 71.709 ± 2.537 ns/op InstructionsBenchmark.forEachEntries 100 avgt 5 738.873 ± 12.132 ns/op InstructionsBenchmark.forEachEntries 1000 avgt 5 7804.431 ± 136.635 ns/op InstructionsBenchmark.forEachEntries 10000 avgt 5 88540.345 ± 14915.682 ns/op InstructionsBenchmark.forEachEntries 100000 avgt 5 1083347.001 ± 136865.960 ns/op InstructionsBenchmark.forEachIterator 1 avgt 5 10.675 ± 2.532 ns/op InstructionsBenchmark.forEachIterator 10 avgt 5 73.934 ± 4.517 ns/op InstructionsBenchmark.forEachIterator 100 avgt 5 775.847 ± 198.806 ns/op InstructionsBenchmark.forEachIterator 1000 avgt 5 8905.041 ± 1294.618 ns/op InstructionsBenchmark.forEachIterator 10000 avgt 5 98686.478 ± 10944.570 ns/op InstructionsBenchmark.forEachIterator 100000 avgt 5 1045309.216 ± 36957.608 ns/op InstructionsBenchmark.forEachKey 1 avgt 5 18.478 ± 1.344 ns/op InstructionsBenchmark.forEachKey 10 avgt 5 76.398 ± 12.179 ns/op InstructionsBenchmark.forEachKey 100 avgt 5 768.507 ± 23.892 ns/op InstructionsBenchmark.forEachKey 1000 avgt 5 11117.896 ± 1665.021 ns/op InstructionsBenchmark.forEachKey 10000 avgt 5 84871.880 ± 12056.592 ns/op InstructionsBenchmark.forEachKey 100000 avgt 5 1114948.566 ± 65582.709 ns/op InstructionsBenchmark.forEachLamada 1 avgt 5 9.444 ± 0.607 ns/op InstructionsBenchmark.forEachLamada 10 avgt 5 76.125 ± 5.640 ns/op InstructionsBenchmark.forEachLamada 100 avgt 5 861.601 ± 98.045 ns/op InstructionsBenchmark.forEachLamada 1000 avgt 5 7769.714 ± 1663.914 ns/op InstructionsBenchmark.forEachLamada 10000 avgt 5 73250.238 ± 6032.161 ns/op InstructionsBenchmark.forEachLamada 100000 avgt 5 836781.987 ± 72125.745 ns/op InstructionsBenchmark.forEachStream 1 avgt 5 29.113 ± 3.275 ns/op InstructionsBenchmark.forEachStream 10 avgt 5 117.951 ± 13.755 ns/op InstructionsBenchmark.forEachStream 100 avgt 5 1064.767 ± 66.869 ns/op InstructionsBenchmark.forEachStream 1000 avgt 5 9969.549 ± 342.483 ns/op InstructionsBenchmark.forEachStream 10000 avgt 5 93154.061 ± 7638.122 ns/op InstructionsBenchmark.forEachStream 100000 avgt 5 1113961.590 ± 218662.668 ns/op InstructionsBenchmark.forEachStreamparallel 1 avgt 5 65.466 ± 5.519 ns/op InstructionsBenchmark.forEachStreamparallel 10 avgt 5 2298.999 ± 721.455 ns/op InstructionsBenchmark.forEachStreamparallel 100 avgt 5 8270.759 ± 1801.082 ns/op InstructionsBenchmark.forEachStreamparallel 1000 avgt 5 16049.564 ± 1972.856 ns/op InstructionsBenchmark.forEachStreamparallel 10000 avgt 5 69230.849 ± 12169.260 ns/op InstructionsBenchmark.forEachStreamparallel 100000 avgt 5 638129.559 ± 14885.962 ns/op InstructionsBenchmark.forEachValues 1 avgt 5 9.743 ± 2.770 ns/op InstructionsBenchmark.forEachValues 10 avgt 5 70.761 ± 16.574 ns/op InstructionsBenchmark.forEachValues 100 avgt 5 745.069 ± 329.548 ns/op InstructionsBenchmark.forEachValues 1000 avgt 5 7772.584 ± 1702.295 ns/op InstructionsBenchmark.forEachValues 10000 avgt 5 74063.468 ± 23752.678 ns/op InstructionsBenchmark.forEachValues 100000 avgt 5 994057.370 ± 279310.867 ns/op
我們可以發(fā)現(xiàn),數(shù)據(jù)量較小的時(shí)候forEachEntries和forEachIterator、以及l(fā)amada循環(huán)效率都差不多forEachStreamarallel的效率反而較低,只有當(dāng)數(shù)據(jù)量達(dá)到10000以上parallelStream的優(yōu)勢(shì)就體現(xiàn)出來(lái)了。所以平時(shí)選擇使用哪種循環(huán)方式的時(shí)候沒(méi)必要太糾結(jié)哪一種方式,其實(shí)每種方式之間的效率還是微乎其微的。選擇適合自己的就好。
“怎么使用HashMap的循環(huán)”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。