foreach语句是java5的新特征之一,在遍历数组、集合方面,foreach为开发人员提供了极大的方便。
foreach语句是for语句的特殊简化版本,但是foreach语句并不能完全取代for语句,然而,任何的foreach语句都可以改写为for语句版本。
foreach并不是一个关键字,习惯上将这种特殊的for语句格式称之为“foreach”语句。从英文字面意思理解foreach也就是“for 每一个”的意思。实际上也就是这个意思。 foreach的语句格式:for(元素类型t 元素变量x : 遍历对象obj){ 引用了x的java语句;} 下面通过几个例子简单例子看看foreach是如何简化编程的。
1.首先增强for循环和iterator遍历的效果是一样的,也就说增强for循环的内部也就是调用iteratoer实现的,
但是增强for循环有些缺点,例如不能在增强循环里动态的删除集合内容。不能获取下标等。
2.ArrayList由于使用数组实现,因此下标明确,最好使用普通循环。
3.而对于LinkedList 由于获取一个元素,要从头开始向后找,因此建议使用增强for循环,也就是iterator。
我这里用的是Junit的进行的测试。
package com.test;
import java.util.ArrayList;
/**
* 增强for循环
*
*/
public class EnhanceDemo {
/**
* 操作数组
*/
@Test
public void testEnhance1() {
int[] i = { 1, 2, 3, 4 };
for (int num : i) {
System.out.println("testEnhance1--> num: " + num);
}
}
/**
* 操作List集合
*/
@Test
public void testEnhance2() {
List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
for (int n : list) {
int num = n;
System.out.println("testEnhance2--> num: " + num);
}
}
/**
* 传统方式
*/
@Test
public void testMap() {
Map<String,String> map = new HashMap<String,String>();
// Map map = new LinkedHashMap(); // LinkedMap是有序的
map.put("1", "aaaa");
map.put("2", "bbbb");
map.put("3", "cccc");
map.put("4", "dddd");
// 拿到keySet,保存所有的key,通过key获取到value
Set<String> set = map.keySet();
Iterator<String> iterator = set.iterator();
while (iterator.hasNext()) {
String key = (String) iterator.next();
String value = (String) map.get(key);
System.out.println(key + " = " + value);
}
// foreach
/*for (Object key : set) {
String value = map.get(key);
System.out.println(key + " === " + value);
}*/
}
/**
* 传统方式2
*/
@Test
public void testMap2() {
Map<String,String> map = new HashMap<String,String>();
// Map map = new LinkedHashMap(); // LinkedMap是有序的
map.put("1", "aaaa");
map.put("2", "bbbb");
map.put("3", "cccc");
map.put("4", "dddd");
// 拿到entrySet它单个的键值对存放
Set<Entry<String, String>> set = map.entrySet();
Iterator<Entry<String, String>> iterator = set.iterator();
while (iterator.hasNext()) {
Entry<String, String> entry = iterator.next();
System.out.println(entry.getKey() + " == " + entry.getValue());
}
// foreach
/*for (Entry<String, String> obj : set) {
Entry<String, String> entry = obj;
entry.getKey();
System.out.println(entry.getKey() + "=== === " + entry.getValue());
}*/
}
/**
* 增强for循环需要注意的几个地方:
* 1,它值适合迭代数据(取数据),而不适合修改数据,并不会修改集合的内容(大小etc)
* 2,需要修改集合的内容,则需要用传统的方式。
*/
@Test
public void foreachTest() {
int[] i = { 1, 2, 3, 4 };
for (int j : i) {
j = 10;
System.out.println("foreach方式:" + i[1]);
}
for (int j = 0; j < i.length; j++) {
System.out.print(i[j]);
i[j] = 10;
System.out.println(" ,传统方式修改:" + i[j]);
}
List<String> list = new ArrayList<String>();
list.add("1");
for (Object object : list) {
object = "100";
System.out.println(list.get(0));
}
}
}
上面遍历Map通过了两种方法:keySet()和entrySet()。
总结
1,foreach语句是for语句特殊情况下的增强版本,简化了编程,提高了代码的可读性和安全性(如:数组下标越界问题)。
2,相对老的for语句来说是个很好的补充。提倡能用foreach的地方就不要再用for了,提高了编程便捷性。
3,在用到对集合或者数组索引的情况下,foreach显得力不从心,这个时候是用传统的for语句的搞定。
4,foreach一般结合泛型使用。
本文探讨了Java中foreach循环的使用,指出其作为for循环的简化版本,尤其适用于遍历数组和集合。虽然foreach不能完全替代for,但在很多情况下可以提高代码可读性和安全性。文章通过例子展示了foreach与iterator遍历ArrayList和LinkedList的差异,并提到了在Map遍历中的应用。最后总结,提倡在可能的情况下优先使用foreach,但在需要访问索引时仍需采用传统for循环。
1196

被折叠的 条评论
为什么被折叠?



