A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

1.在学习IO流时有些问题,就是传统的for循环和高级for循环到底有哪些区别? 什么情况下该用传统for,什么情况下该用高级for??

12 个回复

倒序浏览
增强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));
}
回复 使用道具 举报
增强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));
}

评分

参与人数 1技术分 +1 收起 理由
田向向 + 1 连发两篇你也不容易啊哥们,看来网速不给力.

查看全部评分

回复 使用道具 举报
增强for循环内部是使用的Iterator来遍历的,只能遍历数组和实现了Iterable接口的集合。优点是写法简便,无需获得数组、集合长度,也无需根据索引来访问元素。缺点是不能在循环里动态的删除元素和获取元素下标。
任何的增强for循环都可以改写为for循环。遍历集合所有元素的话用增强for循环更加简洁,如果是复杂的循环,还是用for循环比较好,for循环功支持索引取元素,可以使用下标来控制位置。

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

回复 使用道具 举报
增强for循环和iterator遍历的效果是一样的。增强for循环的内部也就是调用iteratoer实现的。
增强for循环缺点是不能在增强循环里动态的删除集合内容。不能获取下标等等
传统for循环可以执行多次循环,可以控制循环增量和循环条件。如果对数组下标进行操作,最好使用传统for循环

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

回复 使用道具 举报
传统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());

}

评分

参与人数 1技术分 +1 收起 理由
田向向 + 1 赞一个!

查看全部评分

回复 使用道具 举报
罗宵 中级黑马 2012-7-25 22:25:18
7#
传统for循环和增强for循环都可以遍历数组和集合。
传统for循环在遍历的时候有脚标,可以清楚的知道每一个元素。针对需要给某些元素赋值或取出某些具体的元素时用传统for循环。
增强for循环,增强for循环的内部也就是调用iteratoer实现的。遍历相对比较简便,但是没有脚标,无法准确到具体的元素。如果只是单纯遍历可以采取增强for循环
回复 使用道具 举报
罗宵 中级黑马 2012-7-25 22:25:37
8#
传统for循环和增强for循环都可以遍历数组和集合。
传统for循环在遍历的时候有脚标,可以清楚的知道每一个元素。针对需要给某些元素赋值或取出某些具体的元素时用传统for循环。
增强for循环,增强for循环的内部也就是调用iteratoer实现的。遍历相对比较简便,但是没有脚标,无法准确到具体的元素。如果只是单纯遍历可以采取增强for循环
回复 使用道具 举报
罗宵 中级黑马 2012-7-25 22:25:57
9#
传统for循环和增强for循环都可以遍历数组和集合。
传统for循环在遍历的时候有脚标,可以清楚的知道每一个元素。针对需要给某些元素赋值或取出某些具体的元素时用传统for循环。
增强for循环,增强for循环的内部也就是调用iteratoer实现的。遍历相对比较简便,但是没有脚标,无法准确到具体的元素。如果只是单纯遍历可以采取增强for循环
回复 使用道具 举报
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:57
回复 使用道具 举报
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技术分 +1 收起 理由
田向向 + 1 赞一个!

查看全部评分

回复 使用道具 举报
黄锐 发表于 2012-7-25 23:02
1.增强for循环和iterator遍历的效果是一样的,也就说

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

你是纯屌丝,也不看看就往上贴啊
回复 使用道具 举报
增强for循环是jdk1.5的新特性,它是普通for循环的一种简化形式,可以遍历数组和单列集合,map这种双列集合不可以。增强for循环是以遍历结果为目标的,所以如果你想在遍历的过程中对数据进行增删改查,那么我建议你用普通for循环。还有这种例子多练习几遍就知道了,这种问题上网搜下也就哦了。没必要发帖问吧?
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马