集合中迭代器的注意问题
package cn.xiangcong; public class Student { // 成员变量 private String name; private int age; // 构造方法 public Student() { super(); } public Student(String name, int age) { super(); this.name = name; this.age = age; } // 成员方法 // getXxx()/setXxx() public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "Student [name=" + name + ", age=" + age + "]"; } }
package cn.xiagncong; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; /* * 问题1:不要多次使用it.next()方法,因为每次使用都是访问一个对象。 */ public class IteratorTest2 { public static void main(String[] args) { // 创建集合对象 Collection c = new ArrayList(); // 创建学生对象 Student s1 = new Student("spark", 27); Student s2 = new Student("hadoop", 30); Student s3 = new Student("kafka", 33); Student s4 = new Student("flume", 25); Student s5 = new Student("azkaban", 22); // 把学生添加到集合中 c.add(s1); c.add(s2); c.add(s3); c.add(s4); c.add(s5); // 遍历 Iterator it = c.iterator(); while (it.hasNext()) { // 正常情况下的遍历 // Student s = (Student) it.next(); // System.out.println(s.getName() + "---" + s.getAge()); // NoSuchElementException 不要多次使用it.next()方法。当第二次使用next()方法去区年龄的时候其实取的是第二个 // 对象的年龄 System.out.println(((Student) it.next()).getName() + "---"+ ((Student) it.next()).getAge()); } // System.out.println("----------------------------------"); // for循环改写。可以改写但是不建议这么做 // for(Iterator it = c.iterator();it.hasNext();){ // Student s = (Student) it.next(); // System.out.println(s.getName() + "---" + s.getAge()); // } } }
输出结果:
spark---30 kafka---25 Exception in thread "main" java.util.NoSuchElementException at java.util.ArrayList$Itr.next(ArrayList.java:834) at cn.itcast_03.IteratorTest2.main(IteratorTest2.java:38)
通过测试结果很容易看出来前面的名字和年龄是交叉对应的和不是一个对象对应的两个属性