集合--集合的遍历

集合的遍历

程序示例

import java.util.ArrayList;
import java.util.Collection;

/*
        集合的遍历:目的就是将集合中的元素依次取出来
            Object[] toArray()
                把集合转成数组,可以实现集合的遍历
*/

public class CollectionDemo3 {
    public static void main(String[] args) {
        //创建集合对象
        Collection c1 = new ArrayList();

        //添加元素
        c1.add("hello");
        c1.add("world");
        c1.add("java");
        c1.add("20");
      //Integer类型与String类型不能相互转换
      //所以遍历报错
//        c1.add(10);

        //将集合转换成数组
        Object[] array = c1.toArray();

        //遍历数组获取数组中每一个元素
        for (int i = 0; i < array.length; i++) {
//            System.out.println(array[i]);
            //可以输出,但是我要想获取每个字符串的长度呢?
          
            //因为获取到的元素类型是Object类型
            //所以没有length()方法
            //要想调用字符串中的方法,就需要进行向下转型
//            System.out.println(array[i].length());

            String s = (String) array[i];
            System.out.println(s + ",长度为:" + s.length());
        }
    }
}
import java.util.ArrayList;
import java.util.Collection;

/*
        需求:向集合中添加3个学生对象,并遍历学生信息
*/

public class CollectionDemo4 {
    public static void main(String[] args) {
      
        //创建集合
        Collection c1 = new ArrayList();

        //创建3个学生对象
        Student s1 = new Student("李玉伟", 18);
        Student s2 = new Student("刘生发", 17);
        Student s3 = new Student("朱佳乐", 16);

        //将学生对象添加到集合中
        c1.add(s1);
        c1.add(s2);
        c1.add(s3);

        //将学生对象集合转成数组
        Object[] array = c1.toArray();

        //遍历数组
        for (int i = 0; i < array.length; i++) {
            //向下转型,转成元素的类型
            Student s = (Student) array[i];
            System.out.println(s.getName() + "--" + s.getAge());
        }
    }
}

Iterator iterator()  迭代器,集合的专用遍历方式

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

/*
        Iterator iterator()
            迭代器,集合的专用遍历方式
        boolean hasNext()
            如果迭代具有更多元素,则返回 true 。
        Object next()
            返回迭代中的下一个元素。
*/

public class CollectionDemo5 {
    public static void main(String[] args) {
        //创建集合对象
        Collection c1 = new ArrayList();

        //向集合中添加元素
        c1.add("hello");
        c1.add("world");
        c1.add("java");
        c1.add("hadoop");

        //获取c1的迭代器对象
        Iterator iterator = c1.iterator();
      
        //java.util.ArrayList$Itr@4554617c
//        System.out.println(iterator);
      

        //Object next() 返回迭代中的下一个元素。
//        Object obj = iterator.next();
//        System.out.println(obj);
//        System.out.println(iterator.next());
//        System.out.println(iterator.next());
//        System.out.println(iterator.next());
//        System.out.println(iterator.next());
      
        //如果迭代没有更多的元素,NoSuchElementException报错
//        System.out.println(iterator.next());
        //我们通过观察发现,最后一个System.out.println(iterator.next());
        //是多余的,因为此刻已经将迭代器中的元素遍历完了,不应该写
        //我们实际应该在获取之前判断一下下一个位置上是否有元素,如果有就next()获取
        //如果没有就不获取     
      
        //boolean hasNext() 如果迭代具有更多元素,则返回 true 。
//        if(iterator.hasNext()){
//            System.out.println(iterator.next());
//        }
//
//        if(iterator.hasNext()){
//            System.out.println(iterator.next());
//        }
//
//        if(iterator.hasNext()){
//            System.out.println(iterator.next());
//        }
//
//        if(iterator.hasNext()){
//            System.out.println(iterator.next());
//        }
//
//        if(iterator.hasNext()){
//            System.out.println(iterator.next());
//        }
//
//        if(iterator.hasNext()){
//            System.out.println(iterator.next());
//        }
//
//        if(iterator.hasNext()){
//            System.out.println(iterator.next());
//        }

      
        //通过加入了判断我们发现,虽然代码不报错,也可以将结果元素正确的打印
        //但是呢,我们并不知道迭代器什么时候遍历到最后一个元素
        //怎么改进呢?用循环改进
        //由于我们不知道什么时候结束循环,使用while循环
      
        while (iterator.hasNext()) {
            Object next = iterator.next();

            //向下转型
            String s = (String) next;
            System.out.println(s + ",长度为:" + s.length());
        }
    }
}

迭代器的理解

为什么Iterator是一个接口而不是一个类

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

/*
    1、能否将while循环改成普通for循环呢?能,但是不推荐,推荐使用while循环
    2、为什么将Iterator一个接口呢?而不是一个类呢?
        将来你需要根据不同的数据创建不同的集合进行存储,每个集合都有自身独有特点,很有可能每一个
        集合遍历的顺序特点不一样,所以取值的方式也很有可能不一样,所以不应该直接实现,而是通过一个接口
        将来特有的集合要去使用迭代器的时候,就实现一下这个接口,添加自己特有的遍历元素逻辑代码。
*/
public class CollectionDemo6 {
    public static void main(String[] args) {
        //创建学生集合对象
        Collection c1 = new ArrayList();

        //创建学生对象
        Student s1 = new Student("张咪", 16);
        Student s2 = new Student("张梦云", 17);
        Student s3 = new Student("刘梦云", 18);

        //将学生对象添加到集合中
        c1.add(s1);
        c1.add(s2);
        c1.add(s3);

        //获取迭代器对象
        Iterator iterator = c1.iterator();

        //遍历迭代器对象,获取迭代器中的每个元素
        while (iterator.hasNext()) {
            Object next = iterator.next();

//      //向下转型
//        Student s = (Student) next;
//        System.out.println(s.getName() + "--" + s.getAge());
        //或者
            System.out.println(((Student) next).getName() + "--" + ((Student) next).getAge());
        }
         
      
        //在遍历完之后再进行一次获取
        //NoSuchElementException
//        Object next = iterator.next();
//        System.out.println(((Student) next).getName() + "--" + ((Student) next).getAge());


//        System.out.println("===========用普通for循环遍历(不推荐)======================");
//
//        Iterator iterator = c1.iterator();
//        for(;iterator.hasNext();){
//            Object next = iterator.next();
//
//            //向下转型
//            Student s = (Student) next;
//            System.out.println(s.getName() + "--" + s.getAge());
//        }
    }
}

迭代器遍历时指针的工作原理

Collection集合编写完整代码1.0版本

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

/*
        需求:将5个学生对象添加到集合中并遍历
        Collection集合编写代码,完整代码1.0版本
*/

public class CollectionDemo7 {
    public static void main(String[] args) {
        //创建学生集合对象
        Collection c1 = new ArrayList();

        //创建学生对象
        Student s1 = new Student("张咪", 16);
        Student s2 = new Student("张梦云", 17);
        Student s3 = new Student("刘梦云", 18);
        Student s4 = new Student("贝贝", 20);
        Student s5 = new Student("姜水旺", 21);

        //将学生对象添加到集合中
        c1.add(s1);
        c1.add(s2);
        c1.add(s3);
        c1.add(s4);
        c1.add(s5);

        //获取集合中的迭代器对象
        Iterator iterator = c1.iterator();

        //遍历迭代器元素
        while (iterator.hasNext()) {
            Object next = iterator.next();
            //向下转型
            Student s = (Student) next;
            System.out.println(s.getName() + "---" + s.getAge());
        }
    }
}
posted @ 2021-12-18 21:59  赤兔胭脂小吕布  阅读(165)  评论(0编辑  收藏  举报