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