黑马程序员技术交流社区

标题: 高级For循环和一般的for循环有什么区别? [打印本页]

作者: 欧德林    时间: 2012-4-21 17:51
标题: 高级For循环和一般的for循环有什么区别?
高级for(:)

一般循环 for( ; ; )

可以互换吗?
作者: 光sail    时间: 2012-4-21 18:01
当我们要遍历数组或集合是,如果需要访问下标,使用旧式for循环,
如果不需要下标时,使用新式for
作者: 文密    时间: 2012-4-21 18:15
for 你先要给初始化值,循环条件表达式和循环后的操作表达式。

string[] a=new string[]{"a","b"}

for(i=0;i<a.length;i++)
{
Response.write(a.ToString())
}

foreach 不需要事先给初始化值,循环条件值和步长,他是自动遍历指定的集合体的所有值。

foreach(string b in a)
{
Response.write b
}

作者: 王勃    时间: 2012-4-21 18:32
本帖最后由 王明(1988) 于 2012-4-21 18:38 编辑

怎么又有人问!
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。
看代码吧,让这个问题更明朗些。
  1. import java.util.ArrayList;
  2. import java.util.LinkedList;
  3. import java.util.List;

  4. public class ForTest {
  5.         public static void main(String[] args) {
  6.                 //List<Integer> list = new ArrayList<Integer>();
  7.                 List<Integer> list = new LinkedList<Integer>();
  8.                 for (int i = 0; i < 60000; i++) {
  9.                         list.add(5);
  10.                 }
  11.                 int resutl = 0;
  12.                 long start = System.currentTimeMillis();
  13.                 //使用普通for循环
  14.                 for (int i = 0; i < list.size(); i++) {
  15.                         resutl = list.get(i);
  16.                 }
  17.                 System.out.println("普通循环使用了:" + (System.currentTimeMillis() - start)
  18.                                 + "毫秒");
  19.                 start = System.currentTimeMillis();
  20.                 //使用增强for循环,这里什么也不做
  21.                 for (int c2 : list) {
  22.                 }
  23.                 System.out.println("增强for循环使用了:" + (System.currentTimeMillis() - start)
  24.                                 + "毫秒");
  25.         }
  26. }
复制代码
上面的输出结果为:

很明显遍历链表时,使用增强for是非常合适的。如果注释掉LinkedList换上一句代码后,输出结果为:


看得出遍历ArrayList数组时,使用普通for是明智的选择。注意:增强for由于实现了迭代器(java中是Iterator)对数组和集合会先有一个拷贝,改变元素值是不能正常输出的,如果在多线程中则会出错。







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