黑马程序员技术交流社区

标题: 今天学到集合list的问题 [打印本页]

作者: zn123_4    时间: 2013-5-22 21:34
标题: 今天学到集合list的问题
  1. //问:为啥会一直打印 学生姓名:360周鸿祎 ; 学生年龄:24
  2. import java.util.ArrayList;
  3. import java.util.Iterator;
  4. import java.util.List;

  5. public class ListDemo
  6. {
  7.         public static void main(String[] args)
  8.         {
  9.                 List list = new ArrayList();

  10.                 list.add(new Student(21, "阿里巴巴马云"));
  11.                 list.add(new Student(22, "百度李彦宏"));
  12.                
  13.                
  14.                 list.add(new Student(23, "搜狐张朝阳"));
  15.                 list.add(new Student(24, "360周鸿祎"));

  16.                 for (int i = 0; i <list.size(); i++)
  17.                 {
  18.                         Student s = (Student) list.get(i);
  19.                         if ("360周鸿祎".equals(s.getName()))
  20.                         {
  21.                                 list.add(2, new Student(30, "Tecent马化腾"));
  22.                                 list.set(3, new Student(31, "Tecent"));
  23.                         }
  24.                  System.out.println("学生姓名:"+s.getName()+" ; 学生年龄:"+s.getAge());
  25.                 }

  26.                
  27.         }
  28. }
复制代码
帮忙看看为啥会一直打印
作者: yanzhigang    时间: 2013-5-22 21:46
朋友,希望我的回答可以帮到你.一会你再测试一下试一试.不明白的我们再交流.加油吧.我是新手,多多关照.

    程序执行到if ("360周鸿祎".equals(s.getName()));的时候,与new Student(24, "360周鸿祎")中的"360周鸿祎"进行比较,比较返回true,进入if{}
执行list.add(2, new Student(30, "Tecent马化腾"));这是会在list集合索引为2的位置最上元素,此时list集合的长度会增加,for()循环进入下一次循环;
关键是list集合的末尾一直是new Student(24, "360周鸿祎"),故if ("360周鸿祎".equals(s.getName()))依然成立,又在list里面加上new Student(30, "Tecent马化腾");
相当于程序进入了死循环了;我的答案如下:

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class ListDemo
{
        public static void main(String[] args)
        {
                List list = new ArrayList();

                list.add(new Student(21, "阿里巴巴马云"));
                list.add(new Student(22, "百度李彦宏"));
               
               
                list.add(new Student(23, "搜狐张朝阳"));
                list.add(new Student(24, "360周鸿祎"));
                int size = list.size();//在此现将list长度取出固定就好
                for (int i = 0; i <size; i++)//size大小固定,不会进入下次循环
                {
                        Student s = (Student) list.get(i);
                        if ("360周鸿祎".equals(s.getName()))
                        {
                                list.add(2, new Student(30, "Tecent马化腾"));
                                list.set(3, new Student(31, "Tecent"));
                        }
                 System.out.println("学生姓名:"+s.getName()+" ; 学生年龄:"+s.getAge());
                }

               
        }
}
作者: 高波    时间: 2013-5-22 21:57
把你的代码改了一下,不知道与你问的是否相符
  1. import java.util.ArrayList;
  2. import java.util.Iterator;
  3. import java.util.List;

  4. class Student {
  5.         private String name;
  6.         private int age;

  7.         Student(int age, String name) {
  8.                 this.name = name;
  9.                 this.age = age;
  10.         }

  11.         public void setName(String name) {
  12.                 this.name = name;
  13.         }

  14.         public String getName() {
  15.                 return name;
  16.         }

  17.         public void setAge(int age) {
  18.                 this.age = age;
  19.         }

  20.         public int getAge() {
  21.                 return age;
  22.         }
  23. }

  24. public class Demo {
  25.         public static void main(String[] args) {
  26.                 List list = new ArrayList();//你这里是想用多态吗?有必要吗?

  27.                 list.add(new Student(21, "阿里巴巴马云"));
  28.                 list.add(new Student(22, "百度李彦宏"));

  29.                 list.add(new Student(23, "搜狐张朝阳"));
  30.                 list.add(new Student(24, "360周鸿祎"));

  31.                 //这里你为什么要这么遍历,看到你有导入Iterator,为什么不用迭代?
  32.                 // for (int i = 0; i < list.size(); i++) {
  33.                 // Student s = (Student) list.get(i);
  34.                 // if ("360周鸿祎".equals(s.getName())) {
  35.                 // list.add(2, new Student(30, "Tecent马化腾"));
  36.                 // list.set(3, new Student(31, "Tecent"));
  37.                 // }
  38.                 // System.out.println("学生姓名:" + s.getName() + " ; 学生年龄:" + s.getAge());
  39.                 // }
  40.                 Iterator it = list.iterator();
  41.                 while (it.hasNext()) {
  42.                         Student s = (Student) it.next();
  43.                         System.out.println(s.getAge() + " : " + s.getName());
  44.                 }
  45.         }
  46. }
复制代码

作者: SOAR    时间: 2013-5-22 22:21
一楼分析的很好。
作者: 刘治广    时间: 2013-5-22 22:55
遍历不建议用for,建议楼主用Iterator it = c.iterator();遍历输出
作者: 陈潜    时间: 2013-5-22 23:28
楼主的代码执行到22行,找到周宏伟之后,就添加两个对象到list中,这个时候Student(24, "360周鸿祎")原来是排在第3,现在到第5,下一次查找的时候又会找到,然后再次添加,然后Student(24, "360周鸿祎")再次被推到第7,如此死循环。。。。
如果只要添加Student(30, "Tecent马化腾")   Student(31, "Tecent")  就把size改成固定大小,
如果要重新全部打印就在添加了Tecent之后,在定义个for:
for (int i = 0; i<list.size(); i++)
                        {
                                Student s = (Student) list.get(i);
                                if ("360周鸿祎".equals(s.getName()))
                                {
                                        list.add(2, new Student(30, "Tecent马化腾"));
                                        list.set(3, new Student(31, "Tecent"));
                                        System.out.println("找到周宏伟 重新开始打印----------------------");
                                        for (int j = 0; j<list.size(); j++)
                                            {
                                                    Student s1 = (Student) list.get(j);
                                                    System.out.println("学生姓名:"+s1.getName()+" ; 学生年龄:"+s1.getAge());
                                            }
                                        break;
                                }
                         System.out.println("学生姓名:"+s.getName()+" ; 学生年龄:"+s.getAge());
                        }




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