都可以對容器進(jìn)行從頭到尾的遍歷 for(String s:list){ System.out.PRint(s); } Iterator it = list.iterator(); while(it.hasNext()){ System.out.print(it.next()); }實(shí)現(xiàn)了Iterable接口的類,for-each在編譯器中的實(shí)現(xiàn)就是IteratorList<String> list = new ArrayList<String>();for(String s:list){ System.out.print(s);}
不同點(diǎn)
For-each只能讀取元素內(nèi)容,無法對collection進(jìn)行結(jié)構(gòu)性修改(ps:結(jié)構(gòu)性修改一般指改變大小,或者在迭代過程中打亂)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只能讀取當(dāng)前元素,前后元素不可見,而部分Iterator可以獲取前后元素(如實(shí)現(xiàn)了ListIterator接口的..etc)For-each只能單向從頭到尾遍歷,Iterator可以實(shí)現(xiàn)雙向遍歷For-each是語法糖,有很好的閱讀體驗(yàn),同時(shí)避免了迭代器變量多次出現(xiàn)減小BUG幾率;Iterator模式是設(shè)計(jì)模式之一:迭代器模式