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时才存在的!