黑马程序员技术交流社区

标题: 为什么foreach能循环 [打印本页]

作者: 郑志强    时间: 2013-3-13 10:30
标题: 为什么foreach能循环
本帖最后由 郑志强 于 2013-3-14 18:42 编辑

内它并没有循环条件啊?为什么?那什么时候用它,能用于什么类
作者: 李易烜    时间: 2013-3-13 10:54
foreach语句是java5的新特征之一,在遍历数组、集合方面,foreach为开发人员提供了极大的方便。

foreach语句是for语句的特殊简化版本,但是foreach语句并不能完全取代for语句,然而,任何的foreach语句都可以改写为for语句版本。

foreach并不是一个关键字,习惯上将这种特殊的for语句格式称之为“foreach”语句。从英文字面意思理解foreach也就是“for 每一个”的意思。实际上也就是这个意思。

foreach的语句格式:
for(元素类型t 元素变量x : 遍历对象obj){
     引用了x的java语句;
}

foreach语句是for语句特殊情况下的增强版本,简化了编程,提高了代码的可读性和安全性(不用怕数组越界)。相对老的for语句来说是个很 好的补充。提倡能用foreach的地方就不要再用for了。在用到对集合或者数组索引的情况下,foreach显得力不从心,这个时候是用for语句的 时候了。foreach一般结合泛型使用.
作者: wanggang    时间: 2013-3-13 10:55
foreach语句是java5的新特征之一,在遍历数组、集合方面,foreach的语句格式:for(元素类型t 元素变量x : 遍历对象obj){     引用了x的java语句;} 例如:for(int x : arry) {System.out.println(x);}    这是在依次打印出数组arry里的元素的值,就跟  for(int x=0;x<arry.length;x++) {System.out.println(arry[x]);}  是一样的效果

作者: 曾玉锋    时间: 2013-3-13 12:41
本帖最后由 曾玉锋 于 2013-3-13 12:44 编辑

1.首先强调掉的是foreach只能对实现了IEnumerator接口或者间接实现IEnumerator接口的类型进行遍历。
2.foreach遍历集合的过程:
下面是IEnumerator接口,
        public interface IEnumerator
        {
                object Current
                {
                        get;
                }
                bool MoveNext();
                void Reset();
        }
foreach遍历集合的过程如下:
1.将集合或者数组的数据copy一份到内存,并且获得一个IEnumerator对象,获得当前在新的集合或者新数组中的第一个对象赋值给Current,
大家可以看到Current属性是只读的,所以只能读不能修改,况且也不是对原集合或数组中操作。

2.通过调用IEnumerator对象的MoveNext()方法判断是否还有对象可读,且顺序向下依次读取,所以是没法倒着读,也不能用下标去改变读取的顺序。


作者: 郑志强    时间: 2013-3-14 18:41
  谢谢3楼 很详细




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