都可以對容器進行從頭到尾的遍歷 for(String s:list){ System.out.PRint(s); } Iterator it = list.iterator(); while(it.hasNext()){ System.out.print(it.next()); }實現了Iterable接口的類,for-each在編譯器中的實現就是IteratorList<String> list = new ArrayList<String>();for(String s:list){ System.out.print(s);}
不同點
For-each只能讀取元素內容,無法對collection進行結構性修改(ps:結構性修改一般指改變大小,或者在迭代過程中打亂)public class test { static class Person { private int id; private String name; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "Person [id=" + id + ", name=" + name + "]"; } } public static void main(String[] args) { List<Person> list = new ArrayList<Person>(); Person p1 = new Person(); for (int i = 0; i < 5; i++) { Person p = new Person(); p.setId(1); p.setName("name"); list.add(p); } for (Person p : list) { System.out.println(p); list.remove(p);//throws ConcurrentModificationException list.add(p1);//throws ConcurrentModificationException } }}For-each只能讀取當前元素,前后元素不可見,而部分Iterator可以獲取前后元素(如實現了ListIterator接口的..etc)For-each只能單向從頭到尾遍歷,Iterator可以實現雙向遍歷For-each是語法糖,有很好的閱讀體驗,同時避免了迭代器變量多次出現減小BUG幾率;Iterator模式是設計模式之一:迭代器模式