黑马程序员技术交流社区

标题: Collection存储自定义对象中遍历的疑问 [打印本页]

作者: 沈子豪    时间: 2013-3-16 20:06
标题: Collection存储自定义对象中遍历的疑问
本帖最后由 沈子豪 于 2013-3-16 23:23 编辑

Collection存储自定义对象并遍历:
    定义三个Student对象,属性有nameage,遍历集合对象
public class CollectionDemo2 {
       publicstatic void main(String[] args) {
              //创建集合对象
              Collectionc = new ArrayList();
              //创建元素对象
              Students1 = new Student("C", 28);
              Students2 = new Student("梅西", 25);
              Students3 = new Student("穆里尼奥", 42);
              //添加元素
              c.add(s1);
              c.add(s2);
              c.add(s3);
              //遍历元素,方法一
              Iteratorit = c.iterator();
              while(it.hasNext()) {
                     Students = (Student) it.next();
                     System.out.println(s.getName()+ "***" + s.getAge());
              }

              //方法二
               for (Iterator it = c.iterator();it.hasNext();) {
               Student s = (Student) it.next();
              System.out.println(s.getName()+ "***" + s.getAge());
               }
求解方法二中的for循环是怎么完成集合的遍历的?


作者: 黑马李超    时间: 2013-3-16 20:27
for (Iterator it = c.iterator();it.hasNext();) {
               Student s = (Student) it.next();
              System.out.println(s.getName()+ "***" + s.getAge());
               }
Iterator it = c.iterator();是初始化表达式
it.hasNext() 是循环条件表达式
没有循环后操作表达式
作者: 崔自成    时间: 2013-3-16 20:42
hi,兄弟,还记得毕老师说过,while循环和for循环是可以相互转换的嘛,你这里的方法一和方法二就是 相互转换,其实内容都是一样的;
一般我们会把for循环这样写   for(int i=0 ; i < 10 ; i++) 括号里有两个分号分割成了 3部分

第一部分 是 赋值表达式  相当于 你方法 一 中的   Iteratorit = c.iterator(); 语句

第二部分是 条件判断 相当于 方法一中的 while(it.hasNext())  如果条件不满足就终止

第三部分 是更新循环变量, 这里你的 it是迭代器,方法体里 调用.next() 会使指针向下移一位,就相当于更新了循环变量,当指针移到最后一位,it.hasNext() 条件判断为false,就会停止循环,所以第三部分就不用写.


作者: 赵晓东    时间: 2013-3-16 20:43
//方法二
        for (Iterator it = c.iterator();it.hasNext();) {
               Student s = (Student) it.next();
              System.out.println(s.getName()+ "***" + s.getAge());
               }
————————————————————————————
for(初始化表达式;循环条件表达式;循环后表达式)
{
      执行语句;
}
Iterator it = c.iterator();//初始化表达式,记住初始化表达式只执行一次
it.hasNext();//条件表达式,遍历结束返回false
没有循环后表达式
这样做可以有效的节省资源,因为你的方法一(while遍历方法)中的Iterator 在内存中创建的变量是全局变量,一直有效,而for中的Iterator是局部变量只作用于for循环中,for循环结束,而释放掉。哥们,不要太在意这些,老师一句话,我选择,我喜欢
作者: 朱盛文    时间: 2013-3-16 20:43
  1. Collection存储自定义对象并遍历:
  2.     定义三个Student对象,属性有name和age,遍历集合对象
  3. public class CollectionDemo2 {
  4.        publicstatic void main(String[] args) {
  5.               //创建集合对象
  6.               Collectionc = new ArrayList();
  7.               //创建元素对象
  8.               Students1 = new Student("C罗", 28);
  9.               Students2 = new Student("梅西", 25);
  10.               Students3 = new Student("穆里尼奥", 42);
  11.               //添加元素
  12.               c.add(s1);
  13.               c.add(s2);
  14.               c.add(s3);
  15.               //遍历元素,方法一
  16.               Iteratorit = c.iterator();
  17.               while(it.hasNext()) {
  18.                      Students = (Student) it.next();
  19.                      System.out.println(s.getName()+ "***" + s.getAge());
  20.               }
  21.               //方法二
  22.           for (Iterator it = c.iterator();it.hasNext();) {                     //Iterator it = c.iterator();是通过集合对象获取迭代器对象来初始化表达式
  23.                Student s = (Student) it.next();                                    //it.hasNext()是循环条件,返回一个boolean类型的值,当返回true时进入循环
  24.                System.out.println(s.getName()+ "***" + s.getAge());
  25.                }
复制代码

作者: 沈子豪    时间: 2013-3-16 20:57
赵晓东 发表于 2013-3-16 20:43
//方法二
        for (Iterator it = c.iterator();it.hasNext();) {
               Student s = (Stude ...

是怎么初始化的?初始化的什么?
作者: 赵晓东    时间: 2013-3-16 21:07
沈子豪 发表于 2013-3-16 20:57
是怎么初始化的?初始化的什么?

你看,像 int a = 0; 这样的表达式就是初始化表达式,Iterator it = c.iterator();放在这里就叫初始化表达式,因为条件表达式 it.hasNext()用到了it对象,所以在初始化表达式中就对it进行了初始化
作者: 郝强勇    时间: 2013-3-16 21:35
本帖最后由 郝强勇 于 2013-3-16 21:37 编辑

    我觉得你如果不明白在for循环中执行迭代,主要是还不明白for循环的执行过程。
    先看一个for循环:
    for(A;B;C){
             //循环体代码
    }
    这个for循环的执行过程,先执行A且A只执行一次,然后执行B,B是循环判断用的,执行B后如果返回true则进入循环体,循环体执行后在执行C,之后在执行B,如果返回true在执行循环体,在执行C,在执行B... ...如此循环,直到执行B返回false。A、B、C三个地方的代码都可以省略。总之一句话,A执行一次,之后BC循环判断执行,直到B返回false,结束for循环。
    在看你的问题代码:
      for (Iterator it = c.iterator();it.hasNext();) {
                  Student s = (Student) it.next();
                  System.out.println(s.getName()+ "***" + s.getAge());
         }
    先执行A:Iterator it = c.iterator();得到Iterator对象。
    在执行B:it.hasNext();判断指针下一个是否有元素,有元素返回true。
    在执行循环体。执行next()方法时,指针向下一个元素移动一个位置。
    在执行C:这里没有代码,不做任何动作。
    在执行B:it.hasNext();判断指针下一个是否有元素,有元素返回true。
    在执行循环体。执行next()方法时,指针向下一个元素移动一个位置。
    在执行C:这里没有代码,不做任何动作。
    在执行B:it.hasNext();判断指针下一个是否有元素,有元素返回true。
    ... ...
    ... ...
    ... ...
    在执行B:it.hasNext();判断指针下一个是否有元素,没有元素返回false,结束循环体。
   
    就是这个样子了,我想楼主应该明白了。








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