zoukankan      html  css  js  c++  java
  • 浅谈集合框架四——集合扩展:集合循环输出方式及list输出方式的效率对比

    最近刚学完集合框架,想把自己的一些学习笔记与想法整理一下,所以本篇博客或许会有一些内容写的不严谨或者不正确,还请大神指出。初学者对于本篇博客只建议作为参考,欢迎留言共同学习。

      之前有介绍集合框架的体系概念(http://www.cnblogs.com/yjboke/p/8761195.html),本篇介绍一下集合扩展内容:集合循环输出方式及list输出方式的效率对比


    遍历循环输出方式。

      遍历输出方式我这边介绍四种,for循环、迭代器(Iterator)、增强for循环(foreach)和List集合特有的列表迭代器(ListIterator)。

      增强for循环在for循环的基础上简化了代码,普通for循环可以没有遍历的目标,而增强for循环一定要有遍历的目标。在增强for循环中不可以进行增删改等操作,如需增删改等操作请使用普通for循环。

      列表迭代器(ListIterator)是Iterator 的子接口,弥补了其无法新增、修改的缺点。 

      List<String> list = new ArrayList<String>();
            list.add("abc1");
            list.add("abc2");
            list.add("abc3");
            list.add("abc4");
            
            //普通for循环输出
            for(int i = 0; i<list.size(); i++){
                System.out.println(list.get(i));
            }
            
            //增强for循环输出
            for(String s : list){
                System.out.println(s);
            }
            //列表迭代器
            ListIterator<String> li = list.listIterator();
            while(li.hasNext()){
                Object object = li.next();
                if (object.equals("abc3")) {
                    li.add("asd");
                }
            }
            System.out.println(list);
            //迭代器输出
            for(Iterator<String> it = list.iterator(); it.hasNext();){
                System.out.println(it.next());
            }

      Map集合没有实现Iterable接口,所以map集合不能直接使用增强for循环,如果需要使用增强for循环需要借助于Set集合的keySet或entrySet集合。

      Map<Integer, String> map = new HashMap<Integer, String>();
            map.put(1001, "zhangsan");                        
            map.put(1002, "wangwu");
            map.put(1003, "lisi");
            map.put(1004, "maliu");
            //keySet方法
            Set<Integer> keySet = map.keySet();
            for(Integer i : keySet){
                System.out.println("key:"+i+"; value:"+map.get(i));
            }
            //entrySet方法
            Set<Map.Entry<Integer, String>> entrySet = map.entrySet();
            for(Map.Entry<Integer, String> i : entrySet){
                System.out.println("key:" + i.getKey() + "----value:"+i.getValue());
            }

     ——————————————————————————————————————————————————————————————————————

    接下来将上面的代码加一些改动,定义一个长度为20000000的集合,用上方四种方法遍历输出并记录他们所消耗的时间,比较输出的效率。

     1 public static void main(String[] args) {
     2         list();
     3     }
     4     
     5     public static void list() {
     6         List<String> list = new ArrayList<String>();
     7         //定义一个集合的长度
     8         int num = 20000000;
     9         long timeStart,timeEnd;
    10         for (int i = 0; i < num; i++) {
    11             list.add("abd"+i);
    12         }
    13         
    14         //测试foreach循环所用的时间
    15         timeStart = System.currentTimeMillis();
    16         for(String s : list) {
    17             
    18         }
    19         timeEnd = System.currentTimeMillis();
    20         System.out.println("foreach循环时间为:" + (timeEnd-timeStart) + "ms");
    21         
    22         //测试Iterator循环所用的时间
    23         timeStart = System.currentTimeMillis();
    24         Iterator<String> it = list.iterator();
    25         while(it.hasNext()) {
    26             it.next();
    27         }
    28         timeEnd = System.currentTimeMillis();
    29         System.out.println("Iterator循环时间为:" + (timeEnd-timeStart) + "ms");
    30         
    31         //测试Iterator循环所用的时间
    32         timeStart = System.currentTimeMillis();
    33         ListIterator<String> lit = list.listIterator();
    34         while(lit.hasNext()) {
    35             lit.next();
    36         }
    37         timeEnd = System.currentTimeMillis();
    38         System.out.println("ListIterator循环时间为:" + (timeEnd-timeStart) + "ms");
    39         
    40         //测试for循环所用的时间
    41         timeStart = System.currentTimeMillis();
    42         for(int i = 0; i<list.size(); i++) {
    43             list.get(i);
    44         }
    45         timeEnd = System.currentTimeMillis();
    46         System.out.println(" for循环时间为:" + (timeEnd-timeStart) + "ms");
    47     }

      输出结果为:

    foreach循环时间为:143ms
    
    Iterator循环时间为:12ms
    
    ListIterator循环时间为:13ms
    
    for循环时间为:18ms

     然后将四种循环方式单独输出,输出结果为:

    foreach循环时间为:103ms
    Iterator循环时间为:9ms
    ListIterator循环时间为:10ms
    for循环时间为:17ms

     可以看出Iterator和ListIterator相差不多,for循环又稍慢,foreach最慢。(如测试代码有不严谨之处,还请指出,共同学习。其他朋友测试可将集合长度调低测试。)

  • 相关阅读:
    js获取客户端time,cookie,url,ip,refer,user_agent信息:
    生成springboot docker镜像 并上传到阿里云镜像厂库
    install pymongo,mysql
    No module named MYSQLdb 问题解决
    CentOS7下安装python-pip
    task_payment_byonlinedown
    SPLIT_STR
    通过 Composer 安装 Laravel 安装器
    laravel Faker-1.faker假数据
    laravel-admin安装时执行php arisan admin:install 命令时报SQLSTATE[42000]: Syntax error or acce ss violation: 1071 Specified key was too long; max key length is 1000 bytes
  • 原文地址:https://www.cnblogs.com/yjboke/p/8821158.html
Copyright © 2011-2022 走看看