1、Java中的集合框架概述
集合框架净响、
概念與作用
Java中的集合類:是一種工具類少欺,就像是容器,存儲任意數(shù)量的具有共同屬性的對象
集合的作用:
1馋贤、在類的內(nèi)部狈茉,對數(shù)據(jù)進(jìn)行組織;
2掸掸、簡單而快速的搜索大數(shù)量的條目氯庆;
3、有的集合接口扰付,提供了一系列排列有序的元素堤撵,并且可以在序列中間快速的插入或者刪除有關(guān)元素;
4羽莺、有的集合接口实昨,提供了映射關(guān)系,可以通過關(guān)鍵字key去快速查找到對應(yīng)的唯一對象盐固,而這個關(guān)鍵字可以是任意類型
與數(shù)組的對比--為何選擇集合而不是數(shù)組
1荒给、數(shù)組的長度固定,集合長度可變
2刁卜、數(shù)組只能通過下標(biāo)訪問元素志电,類型固定,而有的集合可以通過任意類型查找所映射的具體對象體系結(jié)構(gòu)
Java集合框架
1蛔趴、Collection
List序列:存儲結(jié)構(gòu)排列有序挑辆,可重復(fù)---ArrayList、LinkedList
Queue隊(duì)列:存儲結(jié)構(gòu)排列有序孝情,可重復(fù)---LinkedList
Set集:存儲結(jié)構(gòu)排列無序鱼蝉,不可重復(fù)---HashSet
2、Map<以Key箫荡、Value兩個對象為映射存儲數(shù)據(jù)>---HashMap實(shí)際應(yīng)用
2魁亦、Collection接口&List接口簡介
- Collection接口
是List、Set和Queue接口的父接口
定義了可用于操作List羔挡、Set和Queue的方法---增刪改查
1洁奈、List是元素有序并且可以重復(fù)的集合,被稱為序列
2婉弹、List可以精確的控制每個元素插入的位置睬魂,或刪除某個位置元素
3终吼、ArrayList--數(shù)組序列镀赌,是List的一個重要實(shí)現(xiàn)類
4、ArrayList底層是由數(shù)組實(shí)現(xiàn)的
3际跪、學(xué)生選課-創(chuàng)建學(xué)生類和課程類
-
實(shí)現(xiàn)功能---模擬學(xué)生選課功能
- 選擇課程(往集合中添加課程)
- 刪除所選的某門課程(刪除集合中的元素)
- 查看所選課程
- 修改所選課程
package com.imooc.student;
import java.util.HashSet;
import java.util.Set;
/**
* 學(xué)生類
* @author bzz
*
*/
public class Student {
public String id;
public String name;
public Set courses; //存儲成績信息
public Student(String id,String name){
this.id=id;
this.name=name;
this.courses=new HashSet();
}
}
package com.imooc.student;
/**
* 課程類
* @author bzz
*
*/
public class Course {
public String id;
/**
* 實(shí)際開發(fā)中應(yīng)當(dāng)把所有屬性私有化
* private String id;
* public String getId(){
* return id;
* public void setId(String id){
* this.id=id;
* }
*/
public String name;
public Course(String id,String name){
this.id=id;
this.name=name;
}
}
4商佛、學(xué)生選課-添加課程
package com.imooc.student;
import java.util.Arrays;
import java.util.List;
import java.util.ArrayList;
/**
* 備選課程類
* @author bzz
*
*/
public class ListTest {
public List coursesToSelect;//用于存放備選課程的List
public ListTest(){
this.coursesToSelect=new ArrayList();
}
// 用于往courseToSelect中添加備選課程
public void testAdd(){
//創(chuàng)建一個課程對象喉钢,并通過調(diào)用add,添加到備選課程List中
Course cr1=new Course("1","數(shù)據(jù)結(jié)構(gòu)");
coursesToSelect.add(cr1);
//對象存入集合都變成Object類型良姆,去除時需要類型轉(zhuǎn)換
Course temp=(Course) coursesToSelect.get(0);
System.out.println("添加了課程:"+temp.id+":"+temp.name);
Course cr2=new Course("2","C語言");
coursesToSelect.add(0,cr2);
Course temp2=(Course) coursesToSelect.get(0);
System.out.println("添加了課程:"+temp2.id+":"+temp2.name);
// 以下方法會拋出數(shù)組下標(biāo)越界異常
// Course cr3=new Course("3","test");
// coursesToSelect.add(4,cr3);
Course[] course={new Course("3","離散數(shù)學(xué)"),new Course("4","匯編語言")};
coursesToSelect.addAll(Arrays.asList(course));
Course temp3=(Course) coursesToSelect.get(2);
Course temp4=(Course) coursesToSelect.get(3);
System.out.println("添加了兩門課程"+temp3.id+":"+temp3.name+temp4.id+":"+temp4.name);
Course[] course2={new Course("5","高等數(shù)學(xué)"),new Course("5","大學(xué)英語")};
coursesToSelect.addAll(2,Arrays.asList(course2));
Course temp5=(Course) coursesToSelect.get(2);
Course temp6=(Course) coursesToSelect.get(3);
System.out.println("添加了兩門課程"+temp5.id+":"+temp5.name+temp6.id+":"+temp6.name);
}
public static void main(String[] args){
ListTest lt=new ListTest();
lt.testAdd();
}
}
5肠虽、學(xué)生選課-課程查詢
/**
* 取得List的元素的方法
* @param args
*/
public void testGet(){
int size=coursesToSelect.size();
System.out.println("有如下課程待選:");
for(int i=0;i<size;i++){
Course cr=(Course) coursesToSelect.get(i);
System.out.println("課程:"+cr.id+":"+cr.name);
}
}
/**
* 通過迭代器來遍歷List,不具備存儲功能
* @param args
*/
public void testIterator(){
//通過集合的iterator方法,取得迭代器的實(shí)例
Iterator it=coursesToSelect.iterator();
System.out.println("有如下課程待選(通過迭代器訪問):");
while(it.hasNext()){
Course cr=(Course)it.next();
System.out.println("課程:"+cr.id+":"+cr.name);
}
}
/**
* 通過for each方法訪問集合元素
* @param args
*/
public void testForEach(){
System.out.println("有如下課程待選(通過for each訪問):");
for(Object obj:coursesToSelect){
Course cr=(Course)obj;
System.out.println("課程:"+cr.id+":"+cr.name);
}
}
private Iterator coursesToSelect() {
// TODO Auto-generated method stub
return null;
}
public static void main(String[] args){
ListTest lt=new ListTest();
lt.testAdd();
lt.testGet();
lt.testIterator();
lt.testForEach();
}
}
6玛追、學(xué)生選課-課程修改
/**
* 修改List中的元素
*/
public void testModify(){
coursesToSelect.set(4,new Course("7","毛概"));
}
7税课、學(xué)生選課-課程刪除
public void testRemove(){
//刪除方法1
// Course cr=(Course)coursesToSelect.get(4);
// System.out.println("我是課程:"+cr.id+":"+cr.name+"我即將被刪除");
// coursesToSelect.remove(cr);
//刪除方法2
// System.out.println("即將被刪除4位置的課程");
// coursesToSelect.remove(4);
//刪除方法3
System.out.println("即將被刪除4和5位置的課程");
Course[] courses={(Course)coursesToSelect.get(4),(Course)coursesToSelect.get(5)};
coursesToSelect.removeAll(Arrays.asList(courses));
System.out.println("成功刪除課程!");
testForEach();
}
8痊剖、學(xué)生選課-應(yīng)用泛型管理課程
- 集合中的元素韩玩,可以是任意類型的對象(對象引用)
如果把某個對象放入集合,則會忽略他的類型陆馁,而把他當(dāng)做object處理 - 泛型則是規(guī)定了某個集合只可以存放特定類型的對象
會在編譯期間進(jìn)行類型檢查
package student;
import java.util.ArrayList;
import java.util.List;
public class TestGeneric {
/**
* 帶有泛型——Course找颓,的List類型屬性,尖括號中是規(guī)定的存放類型
*/
public List<Course> courses;
public TestGeneric() {
this.courses = new ArrayList<Course>();//初始化帶有泛型的courses屬性
}
/**
* 測試添加
*/
public void testAdd() {
Course cr1 = new Course("1","大學(xué)語文");
courses.add(cr1);
//泛型集合中叮贩,不能添加泛型規(guī)定的類型及其子類型以外的對象击狮,否則會報(bào)錯!
// courses.add("能否添加一些奇怪的東西呢益老?彪蓬?");
Course cr2 = new Course("2","Java基礎(chǔ)");
courses.add(cr2);
}
/**
* 測試循環(huán)遍歷
* 不是作為object類型取出而是規(guī)定的course類型
*/
public void testForEach() {
for (Course cr : courses) {
System.out.println(cr.id + ":" + cr.name);
}
}
/**
* 泛型集合可以存入泛型類型、泛型的子類型
* 泛型結(jié)合可以添加泛型的子類型的對象實(shí)例
*/
public void testChild() {
ChildCourse ccr = new ChildCourse();
ccr.id = "3";
ccr.name = "我是子類型的課程對象實(shí)例~~";
courses.add(ccr);
}
/**
* 泛型不能使用基本類型
*/
public void testBasicType() {
List<Integer> list = new ArrayList<Integer>();
list.add(1);
System.out.println("基本類型必須使用包裝類作為泛型捺萌!" + list.get(0));
}
/*
* 泛型集合中的限定類型不能使用基本類型寞焙,必須是引用類型
* 可以通過使用包裝類(Interger、Long...)限定允許存入的基本類型
*/
public static void main(String[] args) {
TestGeneric tg = new TestGeneric();
tg.testAdd();
tg.testForEach();
tg.testChild();
tg.testForEach();
tg.testBasicType();
}
}
泛型集合中可以存入泛型類型互婿、泛型的子類型
1捣郊、泛型集合中的限定類型,不能使用基本數(shù)據(jù)類型慈参,只能是引用類型呛牲。
2、可以通過使用包裝類限定允許存入的基本數(shù)據(jù)類型
9驮配、學(xué)生選課-通過Set集合管理課程
- Set接口
1娘扩、Set是元素?zé)o需并且不可以重復(fù)的集合,被稱為集
2壮锻、HashSet---哈希集琐旁,是Set的一個重要實(shí)現(xiàn)類 - 功能說明:
1、提供備選課程
2猜绣、創(chuàng)建學(xué)生兌現(xiàn)灰殴,并給該學(xué)生添加三門課程(添加在學(xué)生的courses--Set類型的屬性中)
顯示備選課程
循環(huán)三次,每次輸入課程ID
往學(xué)生的courses屬性中添加與輸入的ID匹配的課程
輸出學(xué)生選擇的課程
package student;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;
import com.imooc.Course;
import com.imooc.Student;
/*
* Set接口及其實(shí)現(xiàn)類HashSet
* Set是元素?zé)o序并且不可以重復(fù)的集合掰邢,被稱為集
* HashSet--哈希集牺陶,是Set的一個重要實(shí)現(xiàn)類
*/
/*
* 案例功能說明
* 提供備選課程
* 創(chuàng)建學(xué)生對象伟阔,并給該學(xué)生添加三門課程(添加在學(xué)生的courses--Set類型的屬性中)
* --顯示備選課程、循環(huán)三次掰伸,每次輸入課程ID皱炉、
* --往學(xué)生的courses屬性中添加與輸入的ID匹配的課程、輸出學(xué)生選擇的課程
*/
public class SetTest {
public List<Course> coursesToSelect;
private Scanner console;
public Student student;
public SetTest() {
coursesToSelect = new ArrayList<Course>();
console = new Scanner(System.in);
}
/**
* 用于往coursesToSelect中添加備選課程
*/
public void testAdd() {
//創(chuàng)建一個課程對象狮鸭,并通過調(diào)用add方法合搅,添加到備選課程List中
Course cr1 = new Course("1" , "數(shù)據(jù)結(jié)構(gòu)");
coursesToSelect.add(cr1);
Course temp = (Course) coursesToSelect.get(0);
// System.out.println("添加了課程:" + temp.id + ":" + temp.name);
Course cr2 = new Course("2", "C語言");
coursesToSelect.add(0, cr2);
Course temp2 = (Course) coursesToSelect.get(0);
// System.out.println("添加了課程:" + temp2.id + ":" + temp2.name);
// coursesToSelect.add(cr1);
// Course temp0 = (Course) coursesToSelect.get(2);
// System.out.println("添加了課程:" + temp.id + ":" + temp.name);
//以下方法會拋出數(shù)組下標(biāo)越界異常
// Course cr3 = new Course("3", "test");
// coursesToSelect.add(4, cr3);
Course[] course = {new Course("3", "離散數(shù)學(xué)"), new Course("4", "匯編語言")};
coursesToSelect.addAll(Arrays.asList(course));
Course temp3 = (Course) coursesToSelect.get(2);
Course temp4 = (Course) coursesToSelect.get(3);
// System.out.println("添加了兩門課程:" + temp3.id + ":" +
// temp3.name + ";" + temp4.id + ":" + temp4.name);
Course[] course2 = {new Course("5", "高等數(shù)學(xué)"), new Course("6", "大學(xué)英語")};
coursesToSelect.addAll(2, Arrays.asList(course2));
Course temp5 = (Course) coursesToSelect.get(2);
Course temp6 = (Course) coursesToSelect.get(3);
// System.out.println("添加了兩門課程:" + temp5.id + ":" +
// temp5.name + ";" + temp6.id + ":" + temp6.name);
}
/**
* 通過for each方法訪問集合元素
* @param args
*/
public void testForEach() {
System.out.println("有如下課程待選(通過for each訪問):");
for (Object obj : coursesToSelect) {
Course cr = (Course) obj;
System.out.println("課程:" + cr.id + ":" + cr.name);
}
}
public static void main(String[] args) {
SetTest st = new SetTest();
st.testAdd();
st.testForEach();
//創(chuàng)建一個學(xué)生對象
Student student=new Student("1","小明");
System.out.println("歡迎學(xué)生:"+student.name +"選課!");
//創(chuàng)建一個Scanner對象歧蕉,用來接收從鍵盤輸入的課程ID
Scanner console=new Scanner(System.in);
for (int i = 0; i < 3; i++) {
System.out.println("請輸入課程ID");
String courseId=console.next();
for (Course cr:st.coursesToSelect) { //比對Course中coursesToSelect的每個元素
if(cr.id.equals(courseId)) {
student.courses.add(cr);
/**
* Set中历筝,添加某個對象,無論添加多少次廊谓,
* 最終只會保留一個該對象(的引用)梳猪,
* 并且,保留的是第一次添加的那一個
*/
// student.courses.add(null);
// student.courses.add(cr);
}
}
}
st.testForEachForSet(student);
}
public void testForEachForSet(Student student) {
//打印輸出蒸痹,學(xué)生所選的課程春弥!
System.out.println("共選擇了:" + student.courses.size() + "門課程!");
for (Course cr : student.courses) {
System.out.println("選擇了課程:" + cr.id + ":" + cr.name);
}
}
}