a)Iterator
b)Iterable
Iterable接口包含一个可以产生Iterator的iterator()方法,建立了任何实现Iterable接口的类,均可以将它用于foreach语句中。
代码示例java
/** * 遍历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()); } }
主要在与remove方法上有区别,调用remove方法后,list.size()的大小变化。for循环中remove后可能致使错误。
iterator循环中remove后不只会删除元素,还会维护一个标志,用来记录目前是否是可删除状态。 算法
代码示例blog
/** * 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无序,结构不一样,他们的访问算法也不同。接口
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较快。rem