首頁技術(shù)文章正文

Java集合arraylist介紹

更新時(shí)間:2020-08-14 來源:黑馬程序員 瀏覽量:

1、圍觀某學(xué)生管理系統(tǒng)

大伙兒快來看這個(gè)學(xué)生管理系統(tǒng)啊,竟然還在使用數(shù)組來存儲(chǔ)學(xué)生信息數(shù)據(jù),太low了吧。增加學(xué)生數(shù)量還要不停地新建數(shù)組,看來一定是不知道數(shù)組的長度是不可以改變的,是不是應(yīng)該吐槽一下,來我們一起喊,小菜雞~。我們自己來實(shí)現(xiàn)一個(gè)比較牛學(xué)生管理系統(tǒng)。

2、了解集合與數(shù)組

來我們來普及一下數(shù)組的最基本概念,數(shù)組是可以用來存儲(chǔ)相同數(shù)據(jù)類型的數(shù)據(jù)的一種容器,數(shù)組一經(jīng)創(chuàng)建長度是固定的。如果需要改變長度,需要重新創(chuàng)建,不適合在對(duì)象數(shù)量未知的情況下使用的。 那么我們應(yīng)該使用什么容器可以在未知數(shù)量情況下使用呢?那是不是有一種存儲(chǔ)空間可變的存儲(chǔ)模型,存儲(chǔ)的數(shù)據(jù)容量可以發(fā)生改變的容器?一定有的啊,它就是ArrayList集合,長度可以發(fā)生改變,可以在未知數(shù)量的情況下使用,這樣的容器它不香嗎?嗯,香~,那我們一起學(xué)習(xí)一下它的使用吧。

3、集合的常用方法

3.1 構(gòu)造方法

方法名說明
public ArrayList()創(chuàng)建一個(gè)空的集合對(duì)象


代碼演示:

public class TestArrayList{
    public static void main(String[] args){
        // 創(chuàng)建一個(gè)集合對(duì)象
        ArrayList<String> list = new ArryaList<String>();
        /*
        	泛型的使用:<String> 用來約束集合中存儲(chǔ)的數(shù)據(jù)類型 
        	比如:int[] arr = new int[5];  int類型的數(shù)組,可以想到存儲(chǔ)的是int類型的數(shù)據(jù)
        	ArrayList<String> list; <String>可以想到存儲(chǔ)的是String類型的數(shù)據(jù)
        	jdk1.7之后new ArryaList<String>();后面的這個(gè)尖括號(hào)中的String可以不寫
        */
    }
}


3.2 成員方法

方法名說明
public boolean   remove(Object o)刪除指定的元素,返回刪除是否成功
public E   remove(int   index)刪除指定索引處的元素,返回被刪除的元素
public E   set(int index,E   element)修改指定索引處的元素,返回被修改的元素
public E   get(int   index)返回指定索引處的元素
public int   size()返回集合中的元素的個(gè)數(shù)
public boolean   add(E e)將指定的元素追加到此集合的末尾
public void   add(int index,E   element)在此集合中的指定位置插入指定的元素


代碼演示:

public class TestArrayList{
    public static void main(String[] args) {
        // 創(chuàng)建集合
        ArrayList<String> array = new ArrayList<String>();

        // 添加元素
        array.add("hello");
        array.add("world");
        array.add("java");

        // public boolean remove(Object o):刪除指定的元素,返回刪除是否成功
        System.out.println(array.remove("world"));
        System.out.println(array.remove("javaee"));

        // public E remove(int index):刪除指定索引處的元素,返回被刪除的元素
        System.out.println(array.remove(1));

        // 發(fā)生索引越界異常 IndexOutOfBoundsException
        System.out.println(array.remove(3));

        // public E set(int index,E element):修改指定索引處的元素,返回被修改的元素
        System.out.println(array.set(1,"javaee"));

        // 發(fā)生索引越界異常 IndexOutOfBoundsException
        System.out.println(array.set(3,"javaee"));

        // public E get(int index):返回指定索引處的元素
        System.out.println(array.get(0));
        System.out.println(array.get(1));
        System.out.println(array.get(2));

        // public int size():返回集合中的元素的個(gè)數(shù)
        System.out.println(array.size());

        // 輸出集合
        System.out.println("array:" + array);
    }
}

注意:集合是不可以存儲(chǔ)基本數(shù)據(jù)類型的數(shù)據(jù),只能存儲(chǔ)引用數(shù)據(jù)類型的數(shù)據(jù)。


4、ArrayList存儲(chǔ)字符串并遍歷

4.1 演示案例需求

創(chuàng)建一個(gè)存儲(chǔ)字符串的集合,存儲(chǔ)3個(gè)字符串元素,使用程序?qū)崿F(xiàn)在控制臺(tái)遍歷該集合。

代碼演示:

/*
    思路:
        1:創(chuàng)建集合對(duì)象
        2:往集合中添加字符串對(duì)象
        3:遍歷集合,首先要能夠獲取到集合中的每一個(gè)元素,這個(gè)通過get(int index)方法實(shí)現(xiàn)
        4:遍歷集合,其次要能夠獲取到集合的長度,這個(gè)通過size()方法實(shí)現(xiàn)
        5:遍歷集合的通用格式
 */
public class TestArrayList{
    public static void main(String[] args) {
        //創(chuàng)建集合對(duì)象
        ArrayList<String> array = new ArrayList<String>();

        //往集合中添加字符串對(duì)象
        array.add("林青霞");
        array.add("朱茵");
        array.add("王祖賢");

        //遍歷集合,其次要能夠獲取到集合的長度,這個(gè)通過size()方法實(shí)現(xiàn)
//        System.out.println(array.size());

        //遍歷集合的通用格式
        for(int i=0; i<array.size(); i++) {
            String s = array.get(i);
            System.out.println(s);
        }
    }
}

5、ArrayList存儲(chǔ)學(xué)生對(duì)象并遍歷

5.1 演示案例需求

創(chuàng)建一個(gè)存儲(chǔ)學(xué)生對(duì)象的集合,存儲(chǔ)3個(gè)學(xué)生對(duì)象,使用程序?qū)崿F(xiàn)在控制臺(tái)遍歷該集合。

代碼演示:

/*
    思路:
        1:定義學(xué)生類
        2:創(chuàng)建集合對(duì)象
        3:創(chuàng)建學(xué)生對(duì)象
        4:添加學(xué)生對(duì)象到集合中
        5:遍歷集合,采用通用遍歷格式實(shí)現(xiàn)
 */
public class TestArrayList {
    public static void main(String[] args) {
        //創(chuàng)建集合對(duì)象
        ArrayList<Student> array = new ArrayList<>();

        //創(chuàng)建學(xué)生對(duì)象
        Student s1 = new Student("林青霞", 30);
        Student s2 = new Student("朱茵", 33);
        Student s3 = new Student("張曼玉", 18);

        //添加學(xué)生對(duì)象到集合中
        array.add(s1);
        array.add(s2);
        array.add(s3);

        //遍歷集合,采用通用遍歷格式實(shí)現(xiàn)
        for (int i = 0; i < array.size(); i++) {
            Student s = array.get(i);
            System.out.println(s.getName() + "," + s.getAge());
        }
    }
}

//定義學(xué)生類
public class Student{
    // 私有化屬性
    private String name;
    private int age;
    // 提供構(gòu)造方法
    public Student(){
        
    }
    public Student(String name,int age){
        this.name = name;
        this.age = age;
    }
    // 提供get、set方法
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
    
}


6、顯而易見的好處

我們?cè)谧詈笠粋€(gè)案例中,用來存儲(chǔ)對(duì)象信息,是不是完全OK,效果顯而易見。如果再繼續(xù)增加學(xué)員信息個(gè)數(shù),是不是可以隨便增加。那我們?cè)趩为?dú)編寫學(xué)員管理系統(tǒng),可以直接使用ArrayList集合來代替數(shù)組的使用,是不是很方便我們。來我們演示一下:

7、自己來實(shí)現(xiàn)學(xué)生管理系統(tǒng)

7.1 演示步驟:

案例需求

針對(duì)目前我們的所學(xué)內(nèi)容,完成一個(gè)綜合案例:學(xué)生管理系統(tǒng)!該系統(tǒng)主要功能如下:

添加學(xué)生:通過鍵盤錄入學(xué)生信息,添加到集合中

刪除學(xué)生:通過鍵盤錄入要?jiǎng)h除學(xué)生的學(xué)號(hào),將該學(xué)生對(duì)象從集合中刪除

修改學(xué)生:通過鍵盤錄入要修改學(xué)生的學(xué)號(hào),將該學(xué)生對(duì)象其他信息進(jìn)行修改

查看學(xué)生:將集合中的學(xué)生對(duì)象信息進(jìn)行展示

退出系統(tǒng):結(jié)束程序

實(shí)現(xiàn)步驟:

1. 定義學(xué)生類,包含以下成員變量

private String sid // 學(xué)生id

private String name // 學(xué)生姓名

private String age // 學(xué)生年齡

private String address // 學(xué)生所在地

2. 學(xué)生管理系統(tǒng)主界面的搭建步驟

2.1 用輸出語句完成主界面的編寫

2.2 用Scanner實(shí)現(xiàn)鍵盤輸入

2.3 用switch語句完成選擇的功能

2.4 用循環(huán)完成功能結(jié)束后再次回到主界面

3. 學(xué)生管理系統(tǒng)的添加學(xué)生功能實(shí)現(xiàn)步驟

3.1 定義一個(gè)方法,接收ArrayList集合

3.2 方法內(nèi)完成添加學(xué)生的功能

①鍵盤錄入學(xué)生信息

②根據(jù)錄入的信息創(chuàng)建學(xué)生對(duì)象

③將學(xué)生對(duì)象添加到集合中

④提示添加成功信息

3.3 在添加學(xué)生的選項(xiàng)里調(diào)用添加學(xué)生的方法

4. 學(xué)生管理系統(tǒng)的查看學(xué)生功能實(shí)現(xiàn)步驟

4.1 定義一個(gè)方法,接收ArrayList集合

4.2 方法內(nèi)遍歷集合,將學(xué)生信息進(jìn)行輸出

4.3 在查看所有學(xué)生選項(xiàng)里調(diào)用查看學(xué)生方法

5. 學(xué)生管理系統(tǒng)的刪除學(xué)生功能實(shí)現(xiàn)步驟

5.1 定義一個(gè)方法,接收ArrayList集合

5.2 方法中接收要?jiǎng)h除學(xué)生的學(xué)號(hào)

5.3 遍歷集合,獲取每個(gè)學(xué)生對(duì)象

5.4 使用學(xué)生對(duì)象的學(xué)號(hào)和錄入的要?jiǎng)h除的學(xué)號(hào)進(jìn)行比較,如果相同,則將當(dāng)前學(xué)生對(duì)象從集合中刪除

5.5 在刪除學(xué)生選項(xiàng)里調(diào)用刪除學(xué)生的方法

6. 學(xué)生管理系統(tǒng)的修改學(xué)生功能實(shí)現(xiàn)步驟

6.1 定義一個(gè)方法,接收ArrayList集合

6.2 方法中接收要修改學(xué)生的學(xué)號(hào)

6.3 通過鍵盤錄入學(xué)生對(duì)象所需的信息,并創(chuàng)建對(duì)象

6.4 遍歷集合,獲取每一個(gè)學(xué)生對(duì)象。并和錄入的修改學(xué)生學(xué)號(hào)進(jìn)行比較.如果相同,則使用新學(xué)生對(duì)象替換當(dāng)前學(xué)生對(duì)象:

6.5 在修改學(xué)生選項(xiàng)里調(diào)用修改學(xué)生的方法

7. 退出系統(tǒng)

使用外層循環(huán)添加標(biāo)記,終止系統(tǒng)。

7.2 實(shí)現(xiàn)代碼:

// 定義學(xué)生類
public class Student {
    //學(xué)號(hào)
    private String sid;
    //姓名
    private String name;
    //年齡
    private String age;
    //居住地
    private String address;

    public Student() {
    }

    public Student(String sid, String name, String age, String address) {
        this.sid = sid;
        this.name = name;
        this.age = age;
        this.address = address;
    }

    public String getSid() {
        return sid;
    }

    public void setSid(String sid) {
        this.sid = sid;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }
}


// 案例實(shí)現(xiàn)
public class StudentManager {
    /*
        1:用輸出語句完成主界面的編寫
        2:用Scanner實(shí)現(xiàn)鍵盤錄入數(shù)據(jù)
        3:用switch語句完成操作的選擇
        4:用循環(huán)完成再次回到主界面
    */
    public static void main(String[] args) {
        //創(chuàng)建集合對(duì)象,用于保存學(xué)生數(shù)據(jù)信息
        ArrayList<Student> array = new ArrayList<Student>();

        //用循環(huán)完成再次回到主界面
        wc:while (true) {
            //用輸出語句完成主界面的編寫
            System.out.println("--------歡迎來到學(xué)生管理系統(tǒng)--------");
            System.out.println("1 添加學(xué)生");
            System.out.println("2 刪除學(xué)生");
            System.out.println("3 修改學(xué)生");
            System.out.println("4 查看所有學(xué)生");
            System.out.println("5 退出");
            System.out.println("請(qǐng)輸入你的選擇:");

            //用Scanner實(shí)現(xiàn)鍵盤錄入數(shù)據(jù)
            Scanner sc = new Scanner(System.in);
            String line = sc.nextLine();

            //用switch語句完成操作的選擇
            switch (line) {
                case "1":
                    addStudent(array);
                    break;
                case "2":
                    deleteStudent(array);
                    break;
                case "3":
                    updateStudent(array);
                    break;
                case "4":
                    findAllStudent(array);
                    break;
                case "5":
                    System.out.println("謝謝使用");
                    break wc:  // 根據(jù)標(biāo)記終止系統(tǒng)
            }
        }
    }

    //定義一個(gè)方法,用于添加學(xué)生信息
    public static void addStudent(ArrayList<Student> array) {
        //鍵盤錄入學(xué)生對(duì)象所需要的數(shù)據(jù),顯示提示信息,提示要輸入何種信息
        Scanner sc = new Scanner(System.in);

        String sid;

        while (true) {
            System.out.println("請(qǐng)輸入學(xué)生學(xué)號(hào):");
            sid = sc.nextLine();

            boolean flag = isUsed(array, sid);
            if (flag) {
                System.out.println("你輸入的學(xué)號(hào)已經(jīng)被占用,請(qǐng)重新輸入");
            } else {
                break;
            }
        }

        System.out.println("請(qǐng)輸入學(xué)生姓名:");
        String name = sc.nextLine();

        System.out.println("請(qǐng)輸入學(xué)生年齡:");
        String age = sc.nextLine();

        System.out.println("請(qǐng)輸入學(xué)生居住地:");
        String address = sc.nextLine();

        //創(chuàng)建學(xué)生對(duì)象,把鍵盤錄入的數(shù)據(jù)賦值給學(xué)生對(duì)象的成員變量
        Student s = new Student();
        s.setSid(sid);
        s.setName(name);
        s.setAge(age);
        s.setAddress(address);

        //將學(xué)生對(duì)象添加到集合中
        array.add(s);

        //給出添加成功提示
        System.out.println("添加學(xué)生成功");
    }

    //定義一個(gè)方法,判斷學(xué)號(hào)是否被使用
    public static boolean isUsed(ArrayList<Student> array, String sid) {
        //如果與集合中的某一個(gè)學(xué)生學(xué)號(hào)相同,返回true;如果都不相同,返回false
        boolean flag = false;

        for(int i=0; i<array.size(); i++) {
            Student s = array.get(i);
            if(s.getSid().equals(sid)) {
                flag = true;
                break;
            }
        }

        return flag;
    }


    //定義一個(gè)方法,用于查看學(xué)生信息
    public static void findAllStudent(ArrayList<Student> array) {
        //判斷集合中是否有數(shù)據(jù),如果沒有顯示提示信息
        if (array.size() == 0) {
            System.out.println("無信息,請(qǐng)先添加信息再查詢");
            //為了讓程序不再往下執(zhí)行,我們?cè)谶@里寫上return;
            return;
        }

        //顯示表頭信息
        //\t其實(shí)是一個(gè)tab鍵的位置
        System.out.println("學(xué)號(hào)\t\t\t姓名\t\t年齡\t\t居住地");

        //將集合中數(shù)據(jù)取出按照對(duì)應(yīng)格式顯示學(xué)生信息,年齡顯示補(bǔ)充“歲”
        for (int i = 0; i < array.size(); i++) {
            Student s = array.get(i);
            System.out.println(s.getSid() + "\t" + s.getName() + "\t" + s.getAge() + "歲\t\t" + s.getAddress());
        }
    }

    //定義一個(gè)方法,用于刪除學(xué)生信息
    public static void deleteStudent(ArrayList<Student> array) {
        //鍵盤錄入要?jiǎng)h除的學(xué)生學(xué)號(hào),顯示提示信息
        Scanner sc = new Scanner(System.in);

        System.out.println("請(qǐng)輸入你要?jiǎng)h除的學(xué)生的學(xué)號(hào):");
        String sid = sc.nextLine();

        //在刪除/修改學(xué)生操作前,對(duì)學(xué)號(hào)是否存在進(jìn)行判斷
        //如果不存在,顯示提示信息
        //如果存在,執(zhí)行刪除/修改操作

        int index = -1;

        for (int i = 0; i < array.size(); i++) {
            Student s = array.get(i);
            if (s.getSid().equals(sid)) {
                index = i;
                break;
            }
        }

        if (index == -1) {
            System.out.println("該信息不存在,請(qǐng)重新輸入");
        } else {
            array.remove(index);
            //給出刪除成功提示
            System.out.println("刪除學(xué)生成功");
        }
    }

    //定義一個(gè)方法,用于修改學(xué)生信息
    public static void updateStudent(ArrayList<Student> array) {
        //修改之前判斷學(xué)號(hào)是否存在
        Scanner scanner = new Scanner(System.in);
        System.out.println("請(qǐng)輸入要修改的學(xué)號(hào):");
        String sid = scanner.nextLine();
        //先判斷是否存在
        boolean flag = isUsed(array, sid);
        if(flag){
            System.out.println("你輸入的學(xué)號(hào)不存在,請(qǐng)確認(rèn)后修改!");
            return;
        }else {
            System.out.println("請(qǐng)輸入姓名:");
            String name = scanner.nextLine();
            System.out.println("請(qǐng)輸入年齡:");
            String age = scanner.nextLine();
            System.out.println("請(qǐng)輸入居住地:");
            String address = scanner.nextLine();
            //創(chuàng)建對(duì)象
            Student student = new Student(sid,name,age,address);
            //得到索引然后修改
            for (int i = 0; i < array.size(); i++) {
                Student s = array.get(i);
                if (s.getSid().equals(sid)) {
                    array.set(i,student);
                }
            }
        }
        System.out.println("修改成功!");
}


8、總結(jié)

好了,我們自己的學(xué)生管理系統(tǒng)實(shí)現(xiàn)了,是不是比使用數(shù)組來實(shí)現(xiàn)的效果好多了,更加的優(yōu)雅啊。大家要自己學(xué)會(huì)使用這么好用的ArrayList集合哦。


猜你喜歡:

ArrayList類概述和ArrayList類常用方法

ArrayList集合詳解

LinkedList和ArrayList對(duì)比各有什么優(yōu)勢?

Java高級(jí)軟件測試工程師培訓(xùn)

分享到:
在線咨詢 我要報(bào)名
和我們?cè)诰€交談!