zoukankan      html  css  js  c++  java
  • JAVA

    1.使用for_each循环迭代

    public class TestUnit {
        public static void main(String[] args) {
            HashMap hashMap=new HashMap<Integer,String>();
    
            hashMap.put(1,"aaa");
            hashMap.put(2,"bbb");
            hashMap.put(3,"ccc");
    
            for(Object m:hashMap.entrySet()) {
                Map.Entry mapEntry=(Map.Entry)m;
                Object key=mapEntry.getKey();
                Object value=mapEntry.getValue();
                System.out.println("key="+key+",value="+value);
            }
        }
    }

    2.通过构造HashMap的entrySet来迭代

    Iterator iter=hashMap.entrySet().iterator();
    while(iter.hasNext()){
        Map.Entry mapEntry=(Map.Entry) iter.next();
        Object key=mapEntry.getKey();
        Object value=mapEntry.getValue();
        System.out.println("key="+key+",value="+value);
    }

    3.先取得HashMap的keySet,再用get(key)访问

    Set set=hashMap.keySet();
    Iterator iter=set.iterator();
    while(iter.hasNext()){
        Object key=iter.next();
        Object value=hashMap.get(key);
        System.out.println("key="+key+",value="+value);
    }

    Test

    据说是用entrySet更快一点,写段代码测试了一下,确实如此。(纠正:后来发现测试存在问题,谁先执行谁的耗时要多一点,估计是和第一个需要开辟输出缓冲区有关

    import java.util.HashMap;
    import java.util.Iterator;
    import java.util.Map;
    
    public class TestUnit {
    
        public static void main(String[] args) {
            HashMap<Integer, String> hashMap = new HashMap();
            for (int i = 0; i < 10000; i++) {
                hashMap.put(i, "Hello World!");
            }
            forEachTest(hashMap);
            entrySetTest(hashMap);
            keySetTest(hashMap);
        }
    
        static long forEachTest(Map map){
            long startTime =  System.currentTimeMillis();
    
            for(Object m:map.entrySet()) {
                Map.Entry mapEntry=(Map.Entry)m;
                System.out.print(mapEntry.getValue());
            }
    
            long endTime =  System.currentTimeMillis();
            System.out.println("
    forEachTest : " + (endTime - startTime));
            return endTime - startTime;
        }
    
        static long keySetTest(Map map) {
            long startTime =  System.currentTimeMillis();
    
            Iterator iter = map.keySet().iterator();
            while (iter.hasNext()) {
                System.out.print(map.get(iter.next()));
            }
    
            long endTime =  System.currentTimeMillis();
            System.out.println("
    keySetTest : " + (endTime - startTime));
            return endTime - startTime;
        }
    
        static long entrySetTest(Map map) {
            long startTime =  System.currentTimeMillis();
    
            Iterator iter = map.entrySet().iterator();
            Map.Entry mapEntry;
            while (iter.hasNext()) {
                mapEntry = (Map.Entry) iter.next();
                System.out.print(mapEntry.getValue());
            }
    
            long endTime = System.currentTimeMillis();
            System.out.println("
    entrySetTest : " + (endTime - startTime));
            return endTime - startTime;
        }
    }
    View Code

    原因分析:

    • 使用keySet方法访问时,构建的Set只由key组成,访问每一个value时要重新计算Hash值然后根据Hash值到Map中查找value;
    • 使用entrySet方法访问时,构建的Set直接由<key,value>组成,访问每一个value时直接取就行,无需计算Hash值。
  • 相关阅读:
    趣谈编程史第4期-饱受争议的前端之王JavaScript的血泪成长史
    趣谈编程史第2期-这个世界缺少对C语言的敬畏,你不了解的C语言科普
    趣谈编程史第1期-跌宕起伏的java帝国史,剖析谷歌甲骨文长达8年的版权战争
    记录一次Metaspace扩容引发FGC的调优总结
    多线程学习笔记-深入理解ThreadPoolExecutor
    使用CompletableFuture优化你的代码执行效率
    Linux+Shell常用命令总结
    Guava Cache探索及spring项目整合GuavaCache实例
    将List按照指定大小等分的几种实现方式和效率对比及优化
    Spring的事件机制详解
  • 原文地址:https://www.cnblogs.com/crazyacking/p/5573528.html
Copyright © 2011-2022 走看看