黑马程序员技术交流社区

标题: 传统for循环和高级for循环有什么区别呢? [打印本页]

作者: 郑正华    时间: 2012-7-24 21:55
标题: 传统for循环和高级for循环有什么区别呢?
1.在学习IO流时有些问题,就是传统的for循环和高级for循环到底有哪些区别? 什么情况下该用传统for,什么情况下该用高级for??
作者: 乐峰    时间: 2012-7-24 22:07
增强for循环:是一种简化形式,它必须有遍历的目标,该目标要么是数组要么是collection中的单列集合。仅仅是为了获取数组中的元素可以使用高级for.

传统for循环:可以完成对循环执行多次,因为可以控制循环的增量和条件。对数组角标进行操作建议使用传统for.

另外:foreach不可以直接遍历map,因为map中存储的是键值对,但可以将map转成单列set,就可以用了
下面的例子可以证明
public static void main(String[] args)
{
List<Integer> list = new ArrayList<Integer>();
for (int i = 0; i < 5000000; i++)
{
list.add(11);
}


long start = System.currentTimeMillis();
int size = list.size();
int c1 = 1;
for (int i = 0; i < size; i++)
{
c1 = list.get(i);
}
System.out.println("for + get(i)方法: " + (System.currentTimeMillis() - start));


long start2 = System.currentTimeMillis();
for (int c2 : list)
{
}
System.out.println("Iterator(foreach)方法:" + (System.currentTimeMillis() - start2));
}

作者: 乐峰    时间: 2012-7-24 22:08
增强for循环:是一种简化形式,它必须有遍历的目标,该目标要么是数组要么是collection中的单列集合。仅仅是为了获取数组中的元素可以使用高级for.

传统for循环:可以完成对循环执行多次,因为可以控制循环的增量和条件。对数组角标进行操作建议使用传统for.

另外:foreach不可以直接遍历map,因为map中存储的是键值对,但可以将map转成单列set,就可以用了
下面的例子可以证明
public static void main(String[] args)
{
List<Integer> list = new ArrayList<Integer>();
for (int i = 0; i < 5000000; i++)
{
list.add(11);
}


long start = System.currentTimeMillis();
int size = list.size();
int c1 = 1;
for (int i = 0; i < size; i++)
{
c1 = list.get(i);
}
System.out.println("for + get(i)方法: " + (System.currentTimeMillis() - start));


long start2 = System.currentTimeMillis();
for (int c2 : list)
{
}
System.out.println("Iterator(foreach)方法:" + (System.currentTimeMillis() - start2));
}

作者: 刘春发    时间: 2012-7-24 22:21
增强for循环内部是使用的Iterator来遍历的,只能遍历数组和实现了Iterable接口的集合。优点是写法简便,无需获得数组、集合长度,也无需根据索引来访问元素。缺点是不能在循环里动态的删除元素和获取元素下标。
任何的增强for循环都可以改写为for循环。遍历集合所有元素的话用增强for循环更加简洁,如果是复杂的循环,还是用for循环比较好,for循环功支持索引取元素,可以使用下标来控制位置。
作者: 李菁    时间: 2012-7-24 22:39
增强for循环和iterator遍历的效果是一样的。增强for循环的内部也就是调用iteratoer实现的。
增强for循环缺点是不能在增强循环里动态的删除集合内容。不能获取下标等等
传统for循环可以执行多次循环,可以控制循环增量和循环条件。如果对数组下标进行操作,最好使用传统for循环
作者: 张凯    时间: 2012-7-25 06:12
传统for循环与高级for循环的区别:

高级for循环有一个局限性:必须有被遍历的目标。

在遍历数组时,还是使用传统for循环,因为传统for循环有角标。

举例:

set<Integer>keySet=hm.keySet;

for(Integer i : keySet)

{

      System.out.println(i+"..."+hm.get(i));

}

for(Map.Entry<Integer,String> me : hm.entrySet())

{

      System.out.println(me.getKey()+"......"+me.getValue());

}

作者: 罗宵    时间: 2012-7-25 22:25
传统for循环和增强for循环都可以遍历数组和集合。
传统for循环在遍历的时候有脚标,可以清楚的知道每一个元素。针对需要给某些元素赋值或取出某些具体的元素时用传统for循环。
增强for循环,增强for循环的内部也就是调用iteratoer实现的。遍历相对比较简便,但是没有脚标,无法准确到具体的元素。如果只是单纯遍历可以采取增强for循环
作者: 罗宵    时间: 2012-7-25 22:25
传统for循环和增强for循环都可以遍历数组和集合。
传统for循环在遍历的时候有脚标,可以清楚的知道每一个元素。针对需要给某些元素赋值或取出某些具体的元素时用传统for循环。
增强for循环,增强for循环的内部也就是调用iteratoer实现的。遍历相对比较简便,但是没有脚标,无法准确到具体的元素。如果只是单纯遍历可以采取增强for循环
作者: 罗宵    时间: 2012-7-25 22:25
传统for循环和增强for循环都可以遍历数组和集合。
传统for循环在遍历的时候有脚标,可以清楚的知道每一个元素。针对需要给某些元素赋值或取出某些具体的元素时用传统for循环。
增强for循环,增强for循环的内部也就是调用iteratoer实现的。遍历相对比较简便,但是没有脚标,无法准确到具体的元素。如果只是单纯遍历可以采取增强for循环
作者: 黄锐    时间: 2012-7-25 23:02
1.增强for循环和iterator遍历的效果是一样的,也就说

增强for循环的内部也就是调用iteratoer实现的(可以查看编译后的文件),但是增强for循环 有些缺点,例如不能在增强循环里动态的删除集合内容。不能获取下标等。
2.ArrayList由于使用数组实现,因此角标明确,最好使用普通循环。
3.而对于 LinkedList 由于获取一个元素,要从头开始向后找,因此建议使用 增强for循环,也就是iterator

下面的例子可以证明
public static void main(String[] args)
{
List<Integer> list = new ArrayList<Integer>();
for (int i = 0; i < 5000000; i++)
{
list.add(11);
}


long start = System.currentTimeMillis();
int size = list.size();
int c1 = 1;
for (int i = 0; i < size; i++)
{
c1 = list.get(i);
}
System.out.println("for + get(i)方法: " + (System.currentTimeMillis() - start));


long start2 = System.currentTimeMillis();
for (int c2 : list)
{
}
System.out.println("Iterator(foreach)方法:" + (System.currentTimeMillis() - start2));
}
结果:
for + get(i)方法: 94
Iterator(foreach)方法:234
在把ArrayList改为LinkedList,我这里内存溢出了,于是list改成50000
结果:
for + get(i)方法: 6969
Iterator(foreach)方法:0
---------------------

所以在使用的时候适当选择就好了。
作者: 高欢欢    时间: 2012-7-26 10:45
for循环分为两种:
第一种为普通的for循环这种for循环通常需要三个步骤即 for(初始表达式;条件表达式;递增表达式)有时候递增表达式也可以省去,一般是在使用Iterator迭代时(Iterator的hasNext方法判断时,可以省去递增表达式)。这种for循环很常用。
第二种为增强的for循环(也就是foreach循环)这种for循环的内部是调用了Iterator实现的(实现了Iterator接口),和Iterator遍历效果是一样(你可以断点调试跟踪代码看看内部原理),主要用于遍历数组、集合的每一个元素。优点是写法简便,无需获得数组、集合长度,也无需根据索引来访问元素。缺点是不能在循环里动态的删除元素和获取元素下标,还有一点,在多线程下使用增强for来改变元素会出错误,因为通过迭代器实现的增强for对该数组或集合会现有一个拷贝,改变元素是会导致不能正常遍历数组和集合。所以说多线程下增强for是不安全不推荐用。拿数组ArrayList和链表LinkedList来区分记忆: 1.ArrayList由于使用数组实现,因此下标明确,最好使用普通for循环。2.而对于 LinkedList 由于获取一个元素,要从头开始向后找,因此建议使用增强for循环,也就是iterator。

作者: 吴立杰    时间: 2012-7-26 13:39
黄锐 发表于 2012-7-25 23:02
1.增强for循环和iterator遍历的效果是一样的,也就说

增强for循环的内部也就是调用iteratoer实现的(可以查 ...

你是纯屌丝,也不看看就往上贴啊
作者: 吴立杰    时间: 2012-7-26 13:44
增强for循环是jdk1.5的新特性,它是普通for循环的一种简化形式,可以遍历数组和单列集合,map这种双列集合不可以。增强for循环是以遍历结果为目标的,所以如果你想在遍历的过程中对数据进行增删改查,那么我建议你用普通for循环。还有这种例子多练习几遍就知道了,这种问题上网搜下也就哦了。没必要发帖问吧?




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2