zoukankan      html  css  js  c++  java
  • 集合中迭代器的注意问题

    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)

    通过测试结果很容易看出来前面的名字和年龄是交叉对应的和不是一个对象对应的两个属性

  • 相关阅读:
    【Mybatis源码解析】- JDBC连接数据库的原理和操作
    【JDK源码解析】- ArrayList源码解析,绝对详细
    【设计模式】-代理模式及动态代理详解
    【Java基础】反射机制及应用
    Go 中的 channel 与 Java BlockingQueue 的本质区别
    Github Actions 还能做这些事
    写了一个 gorm 乐观锁插件
    Go 去找个对象吧
    Web 自动化测试全面提升之 Pytest
    【51testing专访】web自动化,从入门到进阶
  • 原文地址:https://www.cnblogs.com/itboys/p/6144534.html
Copyright © 2011-2022 走看看