黑马程序员技术交流社区
标题: Collection存储自定义对象中遍历的疑问 [打印本页]
作者: 沈子豪 时间: 2013-3-16 20:06
标题: Collection存储自定义对象中遍历的疑问
本帖最后由 沈子豪 于 2013-3-16 23:23 编辑
Collection存储自定义对象并遍历:
定义三个Student对象,属性有name和age,遍历集合对象
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
- Collection存储自定义对象并遍历:
- 定义三个Student对象,属性有name和age,遍历集合对象
- 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();) { //Iterator it = c.iterator();是通过集合对象获取迭代器对象来初始化表达式
- Student s = (Student) it.next(); //it.hasNext()是循环条件,返回一个boolean类型的值,当返回true时进入循环
- System.out.println(s.getName()+ "***" + s.getAge());
- }
复制代码
作者: 沈子豪 时间: 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 |