Java迭代器

Java迭代器

a)Iterator
b)Iterable
Iterable接口包含一个能够产生Iterator的iterator()方法,创建了任何实现Iterable接口的类,都可以将它用于foreach语句中。
代码示例

    /**
     * 遍历list、map
     */
    public static void test(){
        List list = new ArrayList();
        Map map = new HashMap();
        for(int i = 0; i < 5; i ++){
            list.add("list" + i);
            map.put(i, "list" + i);
        }
        //遍历list
        Iterator iterator_list = list.iterator();
        while (iterator_list.hasNext()){
            String next = (String)iterator_list.next();
            System.out.println(next);
        }
        //遍历map
        map.put(13, "list" + 13);
        map.put(12, "list" + 12);
        Iterator iterator_map = map.entrySet().iterator();
        while (iterator_map.hasNext()){
            Map.Entry  strMap=(Map.Entry)iterator_map.next();
            System.out.println(strMap.getValue());
        }
    }

  

iterator和for循环的区别

主要在与remove方法上有区别,调用remove方法后,list.size()的大小变化。for循环中remove后可能导致错误。
iterator循环中remove后不仅会删除元素,还会维护一个标志,用来记录目前是不是可删除状态。

代码示例

    /**
     * testRemove
     */
    public static void testRemove(){
        List<String> list = new ArrayList<>();
        List<String> iterator_list = new ArrayList<>();
        list.add("A");
        list.add("B");
        list.add("C");
        list.add("D");
        iterator_list.add("A");
        iterator_list.add("B");
        iterator_list.add("C");
        iterator_list.add("D");
        //for循环
        for(int i = 0; i < list.size(); i ++){
            System.out.println(list.get(i));
            if("C".equals(list.get(i))){
                list.remove(list.get(i));
            }
        }
        //iterator循环
        Iterator<String> iterator = iterator_list.iterator();
        while (iterator.hasNext()){
            //iterator.remove(); 报错;调用之前至少有一次next()方法的调用
            String next = iterator.next();
            System.out.println(next);
            if("C".equals(next)){
                iterator.remove();
                //iterator.remove();重复删除会报错,不能连续两次remove
            }
        }
    }

  

如果使用 Iterator 来遍历集合中元素,一旦不再使用 List 转而使用 Set 来组织数据,那遍历元素的代码不用做任何修改,
如果使用 for 来遍历,那所有遍历此集合的算法都得做相应调整,因为List有序,Set无序,结构不同,他们的访问算法也不一样。

iterator和for循环效率比较

a)for循环适合随机结构:
ArrayList对随机访问比较快,而for循环中的get()方法,采用的即是随机访问的方法,因此在ArrayList里,for循环较快。
b)iterator适合顺序结构:
LinkedList则是顺序访问比较快,iterator中的next()方法,采用的即是顺序访问的方法,因此在LinkedList里,使用iterator较快。
ArrayList对随机访问比较快,而for循环中的get()方法,采用的即是随机访问的方法,因此在ArrayList里,for循环较快。
b)iterator适合顺序结构:
LinkedList则是顺序访问比较快,iterator中的next()方法,采用的即是顺序访问的方法,因此在LinkedList里,使用iterator较快。

 

posted @ 2016-11-15 16:41  喝酒骑驴撞城管  阅读(257)  评论(0编辑  收藏  举报