浅谈集合框架四——集合扩展:集合循环输出方式及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最慢。(如测试代码有不严谨之处,还请指出,共同学习。其他朋友测试可将集合长度调低测试。)

posted @ 2018-04-22 16:22  关键我是你杰哥  阅读(374)  评论(0编辑  收藏  举报