//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(); } }