迭代器,泛型中的?,增强for循环


集合框架:

    集合本身是一个工具,在java.util的包里面,所以每次在使用的时候都需要导包.

由于集合中每个容器的数据结构各不相同,不同的容器进行向上抽取,最终就形成了这个框架,也就是collection接口.在接口中有集合框架的很多共性内容,

   

在API中,有更多的Collection接口的用法.

    那么在Collection中,学习他,学习任何容器都要记住3点就可以很好的掌握,

首先是结构,其次是添加元素,最后是获取元素,前两者的方法和之前学的集合,数组都很类似,就不过多介绍,唯独获取方式比较特殊,下面单独介绍一下如何在Collection中获取元素.

获取集合中的元素通常就要用到迭代器,或者增强for循环来进行对其的遍历,

集合中把获取元素的方式储存在Iterator接口中,称之为迭代器:

Iterator接口

Iterator接口中常用的两种方法

hasNext()这个方法负责查找集合中是否存在元素,不管元素有多少,有几个,是什么元素,它只负责查找,如果有元素,他的返回值将会有一个boolean的变量进行判断,如果为true继续查找,如果为false,停止查找.(一般配合while循环进行使用).

 

nest()将查找的元素取出来,直到循环结束时候,它将停止运行,他的返回值类型与取出来的元素相匹配.

 

注意:

 在进行集合元素取出时,如果集合中已经没有元素了,还继续使用迭代器的next方法,将会发生java.util.NoSuchElementException没有集合元素的错误.

迭代器的声明方式:

Iterator<集合中数据类型>iterator()

增强for循环

    如果说在进行对集合遍历的时候不需要考虑到使用索引,那么可以用增强for循环来进行遍历

格式:

for(元素的数据类型  变量 : Collection集合or数组){

}

泛型中的?

当使用泛型类或者接口时,传递的数据中,泛型类型不确定,可以通过通配符<?>表示。但是一旦使用泛型的通配符后,只能使用Object类中的共性方法,集合中元素自身方法无法使用。

定义:(查看ArrayList的构造方法)无法在类中使用

使用:调用方法时可以给予任意类型,参照API中rraylist的构造方法.

?extendsE代表只要是E类型的子类即可

 

?super E代表只要是E类型的父类即可

 

 

/*

*泛型的限定

 * 上限限定  ? extends Animal 只能传 Animal及其子类

 * 下限限定   ? super Animal 只能传Animal及其父类

利用增强for循环进行遍历集合

*/

import java.util.ArrayList;

import java.util.Collection;

 

publicclass test {

   publicstaticvoidmain(String[] args) {

      ArrayList<Animal>list= newArrayList<Animal>();

      list.add(newAnimal());

      list.add(newAnimal());

      ArrayList<dog>list2= newArrayList<dog>();

      list2.add(newdog());

      list2.add(newdog());

     

      ArrayList<cat>list3= newArrayList<cat>();

      list3.add(newcat());

      list3.add(newcat());

      ArrayList<String>list4= newArrayList<String>();

      list4.add("abc");

      list4.add("d");

     

      //show(list3);

      //show(list2);

      show(list);

   }

//定义一个方法 可以遍历这几个结合,并且调用eat的方法

   publicstaticvoidshow(ArrayList<?extendsAnimal> list){

      for(Objectobj:list){

//强制转换,将obj强制转换成Animal类型.

        Animala= (Animal)obj;

        a.eat();

      }

 

   }

  

}

Animal类

publicclass Animal {

   publicvoideat(){

      System.out.println("动物会吃东西");

   }

}

定义dog类,继承Animal,重写Animal的eat方法

publicclass dog extendsAnimal{

   publicvoideat(){

      System.out.println("狗吃肉");

   }

 

}

 

定义cat类, 继承Animal,重写Animal的eat方法

publicclass cat extendsAnimal {

   publicvoideat(){

      System.out.println("猫吃鱼");

   }

}

自定义学生类:包含姓名,年龄,成绩属性.私有成员变量,生成无参,有参构造方法,生成get/set方法.创建5个学生放到ArrayList中.使用迭代器获取每个学生信息.统计总分,平均分,最高分,最低分并输出

publicclass Student {

    private String name;

    privateintage;

    privatedoublescore;

   

    public Student() {}

    public Student(String name,intage, doublescore) {

       this.name = name;

       this.age = age;

       this.score = score;

    }

   

    // getxxx/setxxx

}

测试类:

publicclass Test01 {

    publicstaticvoid main(String[] args) {

       // 定义ArrayList

       ArrayList<Student> students = new ArrayList<>();

      

       // 添加5个学生

       students.add(new Student("张三", 20, 99));

       students.add(new Student("王昭君", 21, 88));

       students.add(new Student("西施", 20, 80));

       students.add(new Student("杨玉环", 20, 70));

       students.add(new Student("凤姐", 22, 30));

      

       // 获取迭代器

       Iterator<Student> itr = students.iterator();

      

       // 定义总分

       doubletotalScore = 0;

       // 定义最高分

       doublemaxScore = students.get(0).getScore();

       // 定义最低分

       doubleminScore = students.get(0).getScore();

      

       // 循环判断是否有下一个学生

       while (itr.hasNext()) {

       // 使用next方法获取学生对象

           Student student = itr.next();

          

       // 将这个学生对象的分数添加到总分

           totalScore += student.getScore();

          

       // 判断这个学生的分数是否大于最大分数

           if (maxScore < student.getScore()) {

       // 这个学生的分数大于最大分数.最大分数等于这个学生的分数     

              maxScore = student.getScore();

           } elseif (minScore > student.getScore()) {

       // 判断这个学生的分数是否大低最大分数

       // 这个学生的分数小于最小分数.最小分数等于这个学生的分数

              minScore = student.getScore();

           }

       }

      

       // 计算平均分(平均分 = 总分/人数)

       doubleavgScore = totalScore / students.size();

       // 打印总分,最高分,最低分

       System.out.println("总分 = " + totalScore + " ,平均分 = " + avgScore + " ,最高分 = " + maxScore + ",最低 = " + minScore);

    }

}

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章