HashMap的7种遍历方式与性能
北京中科白癜风医院爱心分享会 http://disease.39.net/bjzkbdfyy/180102/5972953.html 这是我的第57篇原创文章 首先,给大家说声抱歉~ 事情经过是这样子的,五一节前我发布了一篇文章《HashMap的7种遍历方式与性能分析!》,但是好心的网友却发现了一个问题,他说“测试时使用了sout打印信息会导致测试的结果不准确,因为这样测试的话,大部分的性能消耗其实来源于信息打印”,我细想了一下,说的确实有道理,于是我就重写了测试部分的代码。 但是不写不知道,一写吓一跳,删除了打印信息的代码之后,惊奇的发现,之前得出的“EntrySet和KeySet性能相近”的结论是错误的,并且我也把JMH测试吞吐量的代码换成了平均执行时间,因为这样看起来更直观。而测试的结果是,EntrySet和KeySet的性能相差在一倍以上,详见下文。 本文改动了两处内容: 去掉了测试代码中的打印信息,把测试类型从吞吐量测试改成了平均执行时间测试(这样看起来更直观);新增了EntrySet和KeySet性能差别的原因分析。备注:以上内容为更正后的完整文章。 随着JDK1.8StreamsAPI的发布,使得HashMap拥有了更多的遍历的方式,但应该选择那种遍历方式?反而成了一个问题。 本文先从HashMap的遍历方法讲起,然后再从性能、原理以及安全性等方面,来分析HashMap各种遍历方式的优势与不足,本文主要内容如下图所示: HashMap遍历HashMap遍历从大的方向来说,可分为以下4类: 迭代器(Iterator)方式遍历;ForEach方式遍历;Lambda表达式遍历(JDK1.8+);StreamsAPI遍历(JDK1.8+)。但每种类型下又有不同的实现方式,因此具体的遍历方式又可以分为以下7种: 使用迭代器(Iterator)EntrySet的方式进行遍历;使用迭代器(Iterator)KeySet的方式进行遍历;使用ForEachEntrySet的方式进行遍历;使用ForEachKeySet的方式进行遍历;使用Lambda表达式的方式进行遍历;使用StreamsAPI单线程的方式进行遍历;使用StreamsAPI多线程的方式进行遍历。接下来我们来看每种遍历方式的具体实现代码。 1.迭代器EntrySetpublicclassHashMapTest{publicstaticvoidmain(String[]args){//创建并赋值HashMapMapInteger,Stringmap=newHashMap();map.put(1,"Java");map.put(2,"JDK");map.put(3,"SpringFramework");map.put(4,"MyBatisframework");map.put(5,"Java中文社群");//遍历IteratorMap.EntryInteger,Stringiterator=map.entrySet().iterator();while(iterator.hasNext()){Map.EntryInteger,Stringentry=iterator.next();System.out.println(entry.getKey());System.out.println(entry.getValue());}}} 以上程序的执行结果为: 1 Java 2 JDK 3 SpringFramework 4 MyBatisframework 5 Java中文社群 2.迭代器KeySetpublicclassHashMapTest{publicstaticvoidmain(String[]args){//创建并赋值HashMapMapInteger,Stringmap=newHashMap();map.put(1,"Java");map.put(2,"JDK");map.put(3,"SpringFramework");map.put(4,"MyBatisframework");map.put(5,"Java中文社群");//遍历IteratorIntegeriterator=map.keySet().iterator();while(iterator.hasNext()){Integerkey=iterator.next();System.out.println(key);System.out.println(map.get(key));}}} 以上程序的执行结果为: 1 Java 2 JDK 3 SpringFramework 4 MyBatisframework 5 Java中文社群 3.ForEachEntrySetpublicclassHashMapTest{publicstaticvoidmain(String[]args){//创建并赋值HashMapMapInteger,Stringmap=newHashMap();map.put(1,"Java");map.put(2,"JDK");map.put(3,"SpringFramework");map.put(4,"MyBatisframework");map.put(5,"Java中文社群");//遍历for(Map.EntryInteger,Stringentry:map.entrySet()){System.out.println(entry.getKey());System.out.println(entry.getValue());}}} 以上程序的执行结果为: 1 Java 2 JDK 3 SpringFramework 4 MyBatisframework 5 Java中文社群 4.ForEachKeySetpublicclassHashMapTest{publicstaticvoidmain(String[]args){//创建并赋值HashMapMapInteger,Stringmap=newHashMap();map.put(1,"Java");map.put(2,"JDK");map.put(3,"SpringFramework");map.put(4,"MyBatisframework");map.put(5,"Java中文社群");//遍历for(Integerkey:map.keySet()){System.out.println(key);System.out.println(map.get(key));}}} 以上程序的执行结果为: 1 Java 2 JDK 3 SpringFramework 4 MyBatisframework 5 Java中文社群 5.LambdapublicclassHashMapTest{publicstaticvoidmain(String[]args){//创建并赋值HashMapMapInteger,Stringmap=newHashMap();map.put(1,"Java");map.put(2,"JDK");map.put(3,"SpringFramework");map.put(4,"MyBatisframework");map.put(5,"Java中文社群");//遍历map.forEach((key,value)-{System.out.println(key);System.out.println(value);});}} 以上程序的执行结果为: 1 Java 2 JDK 3 SpringFramework 4 MyBatisframework 5 Java中文社群 6.StreamsAPI单线程publicclassHashMapTest{publicstaticvoidmain(String[]args){//创建并赋值HashMapMapInteger,Stringmap=newHashMap();map.put(1,"Java");map.put(2,"JDK");map.put(3,"SpringFramework");map.put(4,"MyBatisframework");map.put(5,"Java中文社群");//遍历map.entrySet().stream().forEach((entry)-{System.out.println(entry.getKey());System.out.println(entry.getValue());});}} 以上程序的执行结果为: 1 Java 2 JDK 3 SpringFramework 4 MyBatisframework 5 Java中文社群 7.StreamsAPI多线程publicclassHashMapTest{publicstaticvoidmain(String[]args){//创建并赋值HashMapMapInteger,Stringmap=newHashMap();map.put(1,"Java");map.put(2,"JDK");map.put(3,"SpringFramework");map.put(4,"MyBatisframework");map.put(5,"Java中文社群");//遍历map.entrySet().parallelStream().forEach((entry)-{System.out.println(entry.getKey());System.out.println(entry.getValue());});}} 以上程序的执行结果为: 4 MyBatisframework 5 Java中文社群 1 Java 2 JDK 3 SpringFramework 性能测试接下来我们使用Oracle官方提供的性能测试工具JMH(JavaMicrobenchmarkHarness,JAVA微基准测试套件)来测试一下这7种循环的性能。 首先,我们先要引入JMH框架,在pom.xml文件中添加如下配置: !-- |
转载请注明地址:http://www.lanbuzhenga.com/lbzfb/13917.html
- 上一篇文章: 人生最好的境界,就是丰富的安静
- 下一篇文章: 上海即将消失的十大风景线哪一个最让你留