ArrayList

ArrayList集合


ArrayList与数组的区别:

1. 数组和ArrayList的本质区别在于前者是类型安全的,而后者是类型不安全的.
2. ArrayList为了兼容所有类型对象,使用了Object数组,在使用元素的时候会有装箱和拆箱的操作,降低了程序的性能.
3. ArrayList会动态扩充容量,容量为原来的2倍.
4. ArrayList只有把元素添加进去之后才可以通过下标访问相应的元素.
5. 数组在创建的时候就已经确定了数据类型,并且它的长度是固定的,只能通过下标改变各个元素的值和访问.

如果已经知道数据的长度并且不需要频繁的做插入和删除操作,建议使用数组,反之亦然.

ArrayList泛型

ArrayList<数据类型/类名> 集合名 = new ArrayList<>();
<>尖括号里的是泛型String Integer Character Boolean等引用数据类型
如果不写泛型,那么集合里什么元素都能存储,list.add(1); list.add(“abc”);
都可以存储,这样是不安全。
例如:加上那么这个集合里只能存String类型的数据,如果list.add(1); 则会报错

案例一:

目标:学习遍历并删除元素的正确方案

需求

  • 某个班级的考试在系统上进行,成绩大致为 0 ~ 100之间
  • 现在需要先把成绩低于80分的数据去掉

分析:

  • 1.定义ArrayList集合存储多名学员的成绩。
  • 2.遍历集合每个元素,如果元素低于80分,去掉它。

案例一 代码:

public static void arrayListSeeAndDelete() {
        //目标;学习遍历并删除原数的正确方案
        // 1.创建一个ArrayList集合存储一个班级学生的成绩
        ArrayList<Integer> scores = new ArrayList<>();
        scores.add(98);
        scores.add(77);
        scores.add(66);
        scores.add(89);
        scores.add(79);
        scores.add(50);
        scores.add(100);
        System.out.println(scores);
        /*
        方法一:
         */
        // 2.把低于80分的成绩从集合中去掉
        // scores = [98, 77, 66, 89, 79, 50, 100]
        // scores = [98, 77, 66, 89, 79, 50, 100]
       /* for (int i = 0; i < scores.size(); i++) {
            int score = scores.get(i);
            if (score < 80) {
                scores.remove(i);
                i--; //删除成功后,必须退一步才能保证后面不满足条件的元素不被跳过
            }
        }
        System.out.println(scores);*/
       /*
       方法二:
       倒着遍历再删除
        */
        for (int i = scores.size() - 1; i >= 0; i--) {
            int score = scores.get(i);
            if (score < 80) {
                scores.remove(i); // 可以避免跳过删除
        }


    }
}

案例二:

目标:理解ArrayList集合存储自定义类型的对象,并且对集合中对象进行遍历

需求

  • 定义电影类
  • 创建三个电影对象
  • 创建一个电影类型的ArrayList集合存储三部电影对象
  • 遍历电影类型中的每个电影对象,访问其信息并输出

案例二 代码Part Ⅰ:

电影类及其构造方法get/set方法。

public class ArrayListMovieShow {

    //目标:理解ArrayList集合存储自定义类型的对象
    // 1.定义电影类。 ArrayListMovieShow
    private String name;
    private double score;
    private String actor;

    public ArrayListMovieShow(String name, double score, String actor) {
        this.name = name;
        this.score = score;
        this.actor = actor;
    }

    public String getName() {
        return name;
    }

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

    public double getScore() {
        return score;
    }

    public void setScore(double score) {
        this.score = score;
    }

    public String getActor() {
        return actor;
    }

    public void setActor(String actor) {
        this.actor = actor;
    }
}

案例二 代码Part Ⅱ:

主函数部分:

public static void main(String[] args) {
        // 2.创建三个电影类
        ArrayListMovieShow m1 = new ArrayListMovieShow("《肖申克的救赎》", 9.8, "罗宾斯");
        ArrayListMovieShow m2 = new ArrayListMovieShow("《霸王别姬》", 9.7, "张国荣、张丰毅");
        ArrayListMovieShow m3 = new ArrayListMovieShow("《阿甘正传》", 9.6, "汤姆·汉克斯");
        // 3.创建一个电影类型的ArrayList集合,存储三个电影对象
        ArrayList<ArrayListMovieShow> movies = new ArrayList<>();
        movies.add(m1);
        movies.add(m2);
        movies.add(m3);
        System.out.println(movies); //输出三个电影对象的地址
        // 4.遍历电影类型的集合中的每个电影对象。访问他的信息即可
        for (int i = 0; i < movies.size(); i++) {
            ArrayListMovieShow m = movies.get(i);
            System.out.println("电影名:" + m.getName());
            System.out.println("电影得分:" + m.getScore());
            System.out.println("电影主演:" + m.getActor());
            System.out.println("--------------------------------");
        }
    }

输出结果

[javaBase.practice.ArrayListMovieShow@1b6d3586, javaBase.practice.ArrayListMovieShow@4554617c, javaBase.practice.ArrayListMovieShow@74a14482]
电影名:《肖申克的救赎》
电影得分:9.8
电影主演:罗宾斯
--------------------------------
电影名:《霸王别姬》
电影得分:9.7
电影主演:张国荣、张丰毅
--------------------------------
电影名:《阿甘正传》
电影得分:9.6
电影主演:汤姆·汉克斯
--------------------------------

案例三

目标:实现ArrayList遍历,删除,存对象,搜索

需求

  • 后台程序需要储存学生信息并展示,然后要按照学号搜索学生信息的功能

分析:

  • 1.定义 ArrayListStudentSee 类,定义ArrayList集合储存学生对象信息并遍历展示出来。
  • 2.提供一个方法,可以接受ArrayList集合,和要搜索的学号,返回搜索到的学生对象信息并展示,如果搜索不到,返回NULL。
  • 3.使用死循环,让用户可以不停的搜索。

案例三 代码PartⅠ(ArrayListStudentSee类):

public class ArrayListStudentSee {
    private String studentNumber;
    private String name;
    private int age;
    private String className;

    public ArrayListStudentSee() {
    }

    public ArrayListStudentSee(String studentNumber, String name, int age, String className) {
        this.studentNumber = studentNumber;
        this.name = name;
        this.age = age;
        this.className = className;
    }

    public String getStudentNumber() {
        return studentNumber;
    }

    public void setStudentNumber(String studentNumber) {
        this.studentNumber = studentNumber;
    }

    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;
    }

    public String getClassName() {
        return className;
    }

    public void setClassName(String className) {
        this.className = className;
    }
}

案例三 代码:PartⅡ(为test方法调用getStudentById方法得到返回值并输出查询结果)

 public static void main(String[] args) {
        test();
    }
    public static void test() {
        // 1.定义学生类
        // 2.创建集合存储学生对象,创建学生对象封装学生信息
        ArrayList<ArrayListStudentSee> students = new ArrayList<>();

        students.add(new ArrayListStudentSee("20180302", "叶孤城", 23, "护理一班"));
//        ArrayListStudentSee student1 = new ArrayListStudentSee("20180302", "叶孤城", 23, "护理一班");  //上面的分解
//        students.add(student1);

        students.add(new ArrayListStudentSee("20180303", "东方不败", 22, "推拿二班"));
        students.add(new ArrayListStudentSee("20180304", "西门吹雪", 27, "中医药四班"));
        students.add(new ArrayListStudentSee("20180305", "梅超风", 24, "神经科二班"));

        // 3.遍历这些学生信息展示
        for (int i = 0; i < students.size(); i++) {
            ArrayListStudentSee s = students.get(i);
            System.out.println(s.getStudentNumber() + "\t" + s.getName() + "\t" + s.getAge() + "\t" + s.getClassName());

        }
        // 4.定义方法完成按照学好的收缩功能
        Scanner scanner = new Scanner(System.in);
        while (true) {
            System.out.println("请输入学号查询学生对象:");
            String studentNumber = scanner.next();
            // 5.调用方法查询
            ArrayListStudentSee s = getStudentById(students, studentNumber);
            // 6.判断s中是否存在学生对象地址
            if (s == null) {
                System.out.println("对不起,查无此人~~");
            } else {
                System.out.println("您所查询的学生信息如下:");
                System.out.println(s.getStudentNumber() + "\t" + s.getName() + "\t" + s.getAge() + "\t" + s.getClassName());
            }
        }

    }



    /**
     * 根据学生的学号查询学生对象返回
     * @param student       存储全部学生对象的集合
     * @param studyNumber      搜索的学生的学号
     * @return  学生对象 | null
     */
    public static ArrayListStudentSee getStudentById(ArrayList<ArrayListStudentSee> student, String studyNumber) { //根据学号查找学生信息 (学生类型的集合)
        // 1.遍历全部学生对象
        for (int i = 0; i < student.size(); i++) {
            ArrayListStudentSee s = student.get(i);
            // 2.询问当前遍历的这个学生对象的学号,是否是我们要找的学号
            if (s.getStudentNumber().equals(studyNumber)) {
                // 这个s代表的学生对象,就是我们要找的学号
                return s;
            }
        }
        //查无此人
        return null;
    }

案例来自B站黑马,如有错误请多多交流。

posted @   Haziy  阅读(79)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示