3.4 Java 中的集合框架(上)(常用工具類)

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);
        }
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末叠荠,一起剝皮案震驚了整個濱河市匿沛,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌榛鼎,老刑警劉巖逃呼,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異者娱,居然都是意外死亡抡笼,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進(jìn)店門黄鳍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來推姻,“玉大人,你說我怎么就攤上這事框沟〔毓牛” “怎么了?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵忍燥,是天一觀的道長拧晕。 經(jīng)常有香客問我,道長梅垄,這世上最難降的妖魔是什么厂捞? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上蔫敲,老公的妹妹穿的比我還像新娘饲嗽。我一直安慰自己炭玫,他們只是感情好奈嘿,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著吞加,像睡著了一般裙犹。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上衔憨,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天叶圃,我揣著相機(jī)與錄音,去河邊找鬼践图。 笑死掺冠,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的码党。 我是一名探鬼主播德崭,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼揖盘!你這毒婦竟也來了眉厨?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤兽狭,失蹤者是張志新(化名)和其女友劉穎憾股,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體箕慧,經(jīng)...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡服球,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了颠焦。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片有咨。...
    茶點(diǎn)故事閱讀 39,711評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖蒸健,靈堂內(nèi)的尸體忽然破棺而出座享,到底是詐尸還是另有隱情,我是刑警寧澤似忧,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布渣叛,位于F島的核電站,受9級特大地震影響盯捌,放射性物質(zhì)發(fā)生泄漏淳衙。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望箫攀。 院中可真熱鬧肠牲,春花似錦、人聲如沸靴跛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽梢睛。三九已至肥印,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間绝葡,已是汗流浹背深碱。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留藏畅,地道東北人敷硅。 一個月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像愉阎,于是被迫代替她去往敵國和親绞蹦。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,611評論 2 353

推薦閱讀更多精彩內(nèi)容

  • 1诫硕、學(xué)生選課-判斷List中課程是否存在 思考:1坦辟、在課程序列中,如何判斷是否包含某門課或者某幾門課程章办?2锉走、如果課...
    夏沫xx閱讀 433評論 0 2
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法藕届,內(nèi)部類的語法挪蹭,繼承相關(guān)的語法,異常的語法休偶,線程的語...
    子非魚_t_閱讀 31,623評論 18 399
  • title: java集合框架學(xué)習(xí)總結(jié) tags:集合框架 categories:總結(jié) date: 2017-03...
    行徑行閱讀 1,685評論 0 2
  • 概述 Java集合框架由Java類庫的一系列接口梁厉、抽象類以及具體實(shí)現(xiàn)類組成。我們這里所說的集合就是把一組對象組織到...
    absfree閱讀 1,254評論 0 10
  • 我的一星期開始了我先座了晨誦配音我吃完飯就哣我妹 我去學(xué)了游泳 學(xué)完了游泳學(xué)了書法 我回家看了書 一天又開始了我干...
    冰糖小妹葫蘆大哥閱讀 305評論 0 0