集合框架:
集合本身是一个工具,在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);
}
}