foreach 和 普通for循环的区别? java5新添加了foreach特性,这个和以前普遍使用的for有什么区别?好像foreach循环中不能对被遍历的集合进行修改?其它呢? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 如果只是遍历集合或数组 用for each 好些要修改,用for 其它 没什么区别吧 java中成为增强for循环吧如1楼,因为在增强for循环中无法获取index,一般适合用于纯粹的遍历 可以修改的吧 工作大体一样 foreach更简洁 但使用foreach必须是泛型 foreach 语句不需要下标就可以遍历数组中的元素,进行循环;for语句需要下标。 没什么区别..应用的场合不同.有的时候需要获取index有的时候不需要.. 根据你的需要来选择. 建议不要用foreach,因为经过实践,比for更耗系统资源... 要对一个进行foreach循环,这个类必须实现Iterable接口。 不是的吧,在javac 时,已经处理过了 foreach 是jdk1.5出现的新特性。区别没有。实质都是一样的。都是循环遍历。foreach一般只用来取值。要对每个遍历出来的对象进行比较判断时用for循环好点 可以使用foreach的对象必须实现Iterator 接口,遍历集合所有元素的话用foreach更加简洁,for功能是跟强大些,支持index取元素,性能的话你可以用 javap -c 类名 看一下class文件 foreach语句是java5的新特征之一,在遍历数组、集合方面,foreach为开发人员提供了极大的方便。foreach语句是for语句的特殊简化版本,但是foreach语句并不能完全取代for语句,然而,任何的foreach语句都可以改写为for语句版本。foreach并不是一个关键字,习惯上将这种特殊的for语句格式称之为“foreach”语句。从英文字面意思理解foreach也就是“for 每一个”的意思。实际上也就是这个意思。 foreach语句是java5的新特征之一,在遍历数组、集合方面,foreach为开发人员提供了极大的方便。foreach语句是for语句的特殊简化版本,但是foreach语句并不能完全取代for语句,然而,任何的foreach语句都可以改写为for语句版本。foreach并不是一个关键字,习惯上将这种特殊的for语句格式称之为“foreach”语句。从英文字面意思理解foreach也就是“for 每一个”的意思。实际上也就是这个意思。 for each还好 感觉还蛮好用的 至少代码是简化了 foreach只能从头到尾一个接一个遍历for可以使用下标来控制位置 是的,反编译看一下源码,会发现对list的foreach变成了Iterator的普通for foreach本身的实现就是用Iterator 来实现的 foreach适合用于简单的遍历,但是比较复杂的处理还是要用for foreach 有泛型支持,for 还要强转 看了一下,貌似用foreach遍历的类必须实现Iterable接口;另外就是它不能指定位置。 foreach 对遍历数组十分有效 foreach语句是java5的新特征之一,在遍历数组、集合方面,foreach为开发人员提供了极大的方便。foreach语句是for语句的特殊简化版本,但是foreach语句并不能完全取代for语句,然而,任何的foreach语句都可以改写为for语句版本。foreach并不是一个关键字,习惯上将这种特殊的for语句格式称之为“foreach”语句。从英文字面意思理解foreach也就是“for 每一个”的意思。实际上也就是这个意思。 容器类在进行遍历操作的时候不能进行修改操作。foreach 算是一种加强的for循环吧。 代码更加简练一点。试用与对数组 和容器 进行遍历。 foreach在遍历过程中会对执行对象执行锁定,底层也是用Iterator实现的。只有在简单遍历时才推荐使用foreach循环。 用foreah方法必须实现实现相应的Iteratable,不过不用担心,系统都会自动实现的。这种循环只是对for的增强,只是读取,但不能获得所引。是v1.5以上的新特性 我感觉没多大区别,在没有下标的时候用foreach方便些 用for比foreach更为灵活。只是集合或数组遍历麻烦一点,但灵活度不如for. 再次重申,最好不要用foreach..因为比for更耗资源用事实来说话....package my.code;import java.util.Arrays;import java.util.List;public class TestFor { public TestFor() { Integer[] tarray = new Integer[15000000]; for (int i = 0; i < tarray.length; i++) { tarray[i] = 0; } List<Integer> tlist = Arrays.asList(tarray); // 初始化完毕,开始测试 long start = 0, end = 0; // 先测试数组性能 // 一般模式 start = System.currentTimeMillis(); for (int i = 0; i < tarray.length; i++) { } end = System.currentTimeMillis(); System.out.println("数组_一般模式:" + (end - start)); // 预赋值模式 start = System.currentTimeMillis(); for (int i = 0, n = tarray.length; i < n; i++) { } end = System.currentTimeMillis(); System.out.println("数组_预赋值模式:" + (end - start)); // ForEach模式 start = System.currentTimeMillis(); for (Integer i : tarray) { } end = System.currentTimeMillis(); System.out.println("数组_ForEach模式:" + (end - start)); // 测试List性能 // 一般模式 start = System.currentTimeMillis(); for (int i = 0; i < tlist.size(); i++) { } end = System.currentTimeMillis(); System.out.println("List_一般模式:" + (end - start)); // 预赋值模式 start = System.currentTimeMillis(); for (int i = 0, n = tlist.size(); i < n; i++) { } end = System.currentTimeMillis(); System.out.println("List_预赋值模式:" + (end - start)); // ForEach模式 start = System.currentTimeMillis(); for (Integer integer : tlist) { } end = System.currentTimeMillis(); System.out.println("List_ForEach模式:" + (end - start)); } /** * @param args */ public static void main(String[] args) { new TestFor(); }}执行结果:数组_一般模式:31数组_预赋值模式:31数组_ForEach模式:47List_一般模式:188List_预赋值模式:31List_ForEach模式:625============================================得出结论,如果是数组,就不用那么麻烦.....效率几乎完全一样,如果是List,那么,最好用预赋值模式,另外,ForEach模式的效率太低,不值得推荐,虽然ForEach每次循环都要赋一次值,但是我在循环体中加入赋值语句(ForEach中不加):tInt = tarray[i];和tInt = tlist.get(i);执行结果:数组_一般模式:47数组_预赋值模式:47数组_ForEach模式:47List_一般模式:359List_预赋值模式:219List_ForEach模式:625 foreach对于list这些应该是用迭代器遍历,也就是类似与下面这样的实现// 迭代模式start = System.currentTimeMillis();for (Iterator<Integer> iter = tlist.iterator(); iter.hasNext(); iter .next()) {}end = System.currentTimeMillis();System.out.println("List_迭代模式:" + (end - start)); 另外,#44的一般模式和预赋值模式在测试中最好有一个取值操作,恩,毕竟foreach是直接取到值得 发个帖子散一点点点点点分 mysql中文乱码 请问这个equals方法为什么需要做这么多次判断? 有个java的问题向大家请教,请看文章内容 回答问题给分(三) 怎样打印出一个文件所在文件夹的路径? 菜鸟求助。JAVA编的求n!的阶层,用do while语句 请教!java里面如何得到gif图片的帧数? Java正则表达式测试工具,在线试用 jtable 刷新数据库的问题?谢谢! Java 键盘监听事件的疑惑 静态方法不是不能重写吗,这个是怎么回事?
如1楼,因为在增强for循环中无法获取index,一般适合用于纯粹的遍历
for语句需要下标。
foreach一般只用来取值。要对每个遍历出来的对象进行比较判断时用for循环好点
for可以使用下标来控制位置
是的,反编译看一下源码,会发现对list的foreach变成了Iterator的普通for
只有在简单遍历时才推荐使用foreach循环。
package my.code;import java.util.Arrays;
import java.util.List;public class TestFor { public TestFor() {
Integer[] tarray = new Integer[15000000];
for (int i = 0; i < tarray.length; i++) {
tarray[i] = 0;
}
List<Integer> tlist = Arrays.asList(tarray);
// 初始化完毕,开始测试
long start = 0, end = 0; // 先测试数组性能
// 一般模式
start = System.currentTimeMillis();
for (int i = 0; i < tarray.length; i++) { }
end = System.currentTimeMillis();
System.out.println("数组_一般模式:" + (end - start)); // 预赋值模式
start = System.currentTimeMillis();
for (int i = 0, n = tarray.length; i < n; i++) { }
end = System.currentTimeMillis();
System.out.println("数组_预赋值模式:" + (end - start)); // ForEach模式
start = System.currentTimeMillis();
for (Integer i : tarray) { }
end = System.currentTimeMillis();
System.out.println("数组_ForEach模式:" + (end - start)); // 测试List性能
// 一般模式
start = System.currentTimeMillis();
for (int i = 0; i < tlist.size(); i++) { }
end = System.currentTimeMillis();
System.out.println("List_一般模式:" + (end - start)); // 预赋值模式
start = System.currentTimeMillis();
for (int i = 0, n = tlist.size(); i < n; i++) { }
end = System.currentTimeMillis();
System.out.println("List_预赋值模式:" + (end - start)); // ForEach模式
start = System.currentTimeMillis();
for (Integer integer : tlist) { }
end = System.currentTimeMillis();
System.out.println("List_ForEach模式:" + (end - start)); } /**
* @param args
*/
public static void main(String[] args) {
new TestFor();
}}
执行结果:数组_一般模式:31
数组_预赋值模式:31
数组_ForEach模式:47
List_一般模式:188
List_预赋值模式:31
List_ForEach模式:625============================================
得出结论,如果是数组,就不用那么麻烦.....效率几乎完全一样,如果是List,那么,最好用预赋值模式,另外,ForEach模式的效率太低,不值得推荐,虽然ForEach每次循环都要赋一次值,但是我在循环体中加入赋值语句(ForEach中不加):
tInt = tarray[i];
和
tInt = tlist.get(i);执行结果:数组_一般模式:47
数组_预赋值模式:47
数组_ForEach模式:47
List_一般模式:359
List_预赋值模式:219
List_ForEach模式:625
// 迭代模式
start = System.currentTimeMillis();
for (Iterator<Integer> iter = tlist.iterator(); iter.hasNext(); iter
.next()) {
}
end = System.currentTimeMillis();
System.out.println("List_迭代模式:" + (end - start));