//Iterable JDK源码 //能够经过成员内部类,方法内部类,甚至匿名内部类去实现Iterator public interface Iterable<T> { Iterator<T> iterator();
public interface Iterator<E> { boolean hasNext(); //每次next以前,先调用此方法探测是否迭代到终点 E next(); //返回当前迭代元素 ,同时,迭代游标后移 /*删除最近一次已近迭代出出去的那个元素。 只有当next执行完后,才能调用remove函数。 好比你要删除第一个元素,不能直接调用 remove() 而要先next一下( ); 在没有先调用next 就调用remove方法是会抛出异常的。 这个和MySQL中的ResultSet很相似 */ void remove() { throw new UnsupportedOperationException("remove"); }
import java.util.ArrayList; import java.util.Iterator; public class test { public static void main(String[] args) { ArrayList<Person> array = new ArrayList<Person>(); Person p1 = new Person("Tom1"); Person p2 = new Person("Tom2"); Person p3 = new Person("Tom3"); Person p4 = new Person("Tom4"); array.add(p1); array.add(p2); array.add(p3); array.add(p4); Iterator<Person> iterator = array.iterator(); for (Person pp : array){ System.out.println(pp.getName()); } System.out.println("\r\n" + "-----利用Lambda表达式的foreach-----" + "\r\n"); array.forEach(obj -> System.out.println(obj.getName())); System.out.println("\r\n" + "-----利用for循环-----" + "\r\n"); for(Person p : array){ p.setName("wang"); } while(iterator.hasNext()){ System.out.println(iterator.next().getName()); //输出的是wang,而不是tom } } }
public static void main(String[] args) { Map map = new HashMap(); for(int i = 0; i < 10; i ++){ map.put(i, String.valueOf("map" + i)); } Iterator iterMap = map.entrySet().iterator(); while(iterMap.hasNext()){ Map.Entry strMap = (Map.Entry)iterMap.next(); System.out.println("key为:" + strMap.getKey() + ", value为:" + strMap.getValue()); } }
那么当Iterator迭代访问Collection集合中元素时,Collection的元素不能改变(多个线程的修改),只有经过Iterator的remove()方法删除上一次next()方法返回集合才能够。这样会引起ModificationException异常,即fail-fast机制java
//建立集合,添加元素和上述同样 Iterator<Person> iterator = array.iterator(); while(iterator.hasNext()){ String name = iterator.next().getName(); System.out.println(name); if(name.equals("Tom3")){ //array.remove(name); 不推荐这种方式 iterator.remove(); } }