1 做用java
簡化迭代器的書寫格式。(注意:foreach循環的底層仍是使用了迭代器遍歷。)數組
2 適用範圍jvm
若是是實現了Iterable接口的對象或者是數組對象均可以使用foreach循環。spa
3 格式code
for(數據類型 變量名 :遍歷的目標){對象
}blog
示例:索引
1 public static void main(String[] args) { 2 HashSet<String> set = new HashSet<>(); 3 set.add("張三"); 4 set.add("李四"); 5 set.add("王五"); 6
7 }
若想遍歷這個集合,能夠用迭代器接口
1 //使用迭代器遍歷集合
2 Iterator it = set.iterator(); 3 while(it.hasNext()){ 4 System.out.println("集合的元素爲: " + it.next()); 5 }
有沒有更簡潔的辦法呢?能夠用foreach循環element
1 for(String it : set){ 2 System.out.println("集合的元素:" + it); 3 }
這個循環應該讀做 -- 「循環set中的每個元素」(for each element in set)
4 foreach循環的優勢在於:相比普通for循環來更加簡潔,更加不容易出錯(沒必要爲數組下標的起始值和終止值擔憂)
5 foreach循環應該注意的事項:
(1). foreach循環底層也是使用了迭代器獲取的,只不過獲取迭代器由jvm完成,不須要咱們獲取迭代器而已,因此在使用foreach循環變量元素的過程當中不許使用集合對象對集合的元素個數進行修改。
也就是說:
1 for(String it : set){ 2 System.out.println("集合的元素:" + it); 3 set.remove("it"); 4 }
上面這個調用remove方法是錯誤的!
(2). 普通for循環與foreach循環的區別:普通for循環能夠沒有變量的目標,而foreach循環必定要有變量的目標。
6 缺點:在對數組索引進行操做或者集合進行增刪操做時,顯得力不從心,此時不建議使用foreach循環
回顧第二點,它的使用範圍,若是如今有一個Map集合,怎麼對它使用foreach循環?
經過查看API文檔可得知,Map集合沒有實現Iterable接口,因此Map集合不能直接使用foreach循環
可是它有一個entrySet方法(Map的迭代方法),它的返回類型是Set<Map.Entry<K,V>>
:
咱們知道Set接口下是實現了Iterable接口的:
因此咱們能夠這樣:
1 HashMap<String, String> map = new HashMap<String, String>(); 2 map.put("001","張三"); 3 map.put("002","李四"); 4 map.put("003","王五"); 5 map.put("004","趙六"); 6 Set<Map.Entry<String, String>> entrys = map.entrySet(); 7 for(Map.Entry<String, String> entry : entrys){ 8 System.out.println("鍵:"+ entry.getKey()+" 值:"+ entry.getValue()); 9 }
最後的最後:這是JDK1.5時才存在的!