美文网首页
11.常用API—ArrayList

11.常用API—ArrayList

作者: 每天起床都想摆 | 来源:发表于2022-01-13 19:36 被阅读0次

ArrayList

集合概述

  • ArrayList类代表的是集合类,集合是一种容器,与数组类似,不同的是集合的大小是不固定的
  • 集合的大小不固定,启动后可以动态变化,类型也可以选择不固定
  • 集合非常适合元素个数不确定,且要进行增删操作的业务场景
  • 集合相比数组而言,提供了大量丰富的API

ArrayList集合快速入门

  • ArrayList是集合中的一种,它支持索引

  • ArrayList集合的对象获取

    构造器 说明
    public ArrayList() 创建一个空的集合对象
  • ArrayList集合添加元素的方法

    方法名 说明
    public boolean add(E e) 将指定的元素追加到集合的末尾
    public void add(int index, E element) 在此集合中的指定位置插入指定的元素
  • package com.java.test;
    
    import java.util.ArrayList;
    
    public class ArrayListDemo {
        public static void main(String[] args) {
            // 1.创建ArrayList对象,代表集合容器,往里面添加元素
            ArrayList list = new ArrayList();
            // 2. 添加数据
            list.add("Java");
            list.add("MySQL");
            list.add("后端开发");
            list.add(666);
            list.add(233.33);
            list.add('S');
    
            // add方法添加成功返回true,失败返回false;通常情况下,集合add操作不会失败
            System.out.println(list.add("^_^"));
            // 直接打印集合list对象,和数组不同的是得到的不是地址值,而直接是遍历了集合中的元素
            System.out.println(list);
    
            // 指定索引插入元素,原本的元素以及其后所有的元素向后挪
            list.add(1, "最好的伙伴");
            System.out.println(list);
        }
    }
    /*
    true
    [Java, MySQL, 后端开发, 666, 233.33, S, ^_^]
    [Java, 最好的伙伴, MySQL, 后端开发, 666, 233.33, S, ^_^]
     */
    

ArrayList对泛型的支持

泛型概述

  • ArrayList<E>:其实就是一个泛型类,可以在编译阶段约束集合对象只能操作某种集合数据类型

  • 集合只能存储引用类型,不支持基本数据类型,因此基本数据类型必须书写成其包装类的形式

    • 举例:

      ArrayList<String>:此集合只能操作字符串类型的元素

      ArrayList<Integer>:此集合只能操作整数类型的元素

  • ArrayList<String> list = new ArrayList<String>();
    
    // 从JDK1.7开始,泛型后面的类型申明可以不写
    ArrayList<String> list = new ArrayList();
    
  • // 使用泛型来约束集合操作类型是良好的编码规范,即使是装载多类型的集合,也采用泛型实现,而不是不使用泛型
    
    // 泛型-所有元素
    ArrayList<Object> list = new ArrayList();
    
    //不是用泛型-所有元素
    ArrayList list = new ArrayList();
    

ArrayList常用API,遍历

方法名称 说明
public E get(int index) 返回指定索引处的元素
public int size() 返回集合中元素的个数
public E remove(int index) 删除指定索引处的元素,返回被删除的元素
public boolean remove(Object o) 删除指定的元素,返回删除是否成功
public E set(int index, E element) 修改指定索引处的元素,返回被修改的元素
package com.java.test;

import java.util.ArrayList;

public class ArrayListTest {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList();
        list.add("Java");
        list.add("JavaWeb");
        list.add("JavaScript");
        list.add("MySQL");
        list.add("MyBatis");
        list.add("JDBC");
        System.out.println(list);

        // 1. public  E  get(int  index)               | 返回指定索引处的元素
        System.out.println(list.get(2));

        // 2. public  int  size()                      | 返回集合中元素的个数
        System.out.println(list.size());

        // 集合遍历
        for (int i = 0; i < list.size(); i++) {
            System.out.println(list.get(i));
        }


        // 3. public  E  remove(int  index)            | 删除指定索引处的元素,返回被删除的元素
        System.out.println(list.remove(5));
        System.out.println(list);

        // 4. public  boolean  remove(Object  o)       | 删除指定的元素,返回删除是否成功
        // 当集合中存在相同的元素时,只会删除首次出现的元素
        System.out.println(list.remove("MySQL"));
        System.out.println(list);

        // 5. public  E  set(int  index,  E  element)  | 修改指定索引处的元素,返回被修改的元素
        System.out.println(list.set(0, "PHP")); // 返回的是指定索引的原来的元素
        System.out.println(list);

    }
}

ArrayList集合案例:

  • 需求:某个班级的考试在系统上进行,成绩大致为:98,77,66,89,79,50,100;
    现在需要先把成绩低于80分以下的数据去掉

ArrayList遍历并删除元素

package com.java.test;

import java.util.ArrayList;

public class ArrayListScore {
    public static void main(String[] args) {
        ArrayList<Integer> list = new ArrayList<Integer>();
        list.add(98);
        list.add(77);
        list.add(66);
        list.add(89);
        list.add(79);
        list.add(50);
        list.add(100);

        // 集合正推出bug因为元素的索引随着删除元素而动态变化着,所以需要倒着循环
        /*                      <---- i
            [98, 77, 66, 89, 79, 50, 100]
            [98, 77, 66, 89, 79, 100]
            [98, 77, 66, 89, 100]
            [98, 77, 89, 100]
            [98, 89, 100]
            从后往前判断,删除元素时,长度-1,上一轮循环判断过的元素重新被判断
         */
        for (int i = list.size() - 1; i >= 0; i--) {
            if (list.get(i) < 80) {
                list.remove(i);
            }
        }
        for (int i = 0; i < list.size(); i++) {
            System.out.println(list.get(i));
        }
    }
}

对于从集合中遍历元素,并筛选出元素删除它,解决思路:

  • 从集合后面遍历然后删除,可以避免漏掉元素

ArrayList存储自定义类型的对象

  • 需求:某影院系统需要在后台存储三部电影,然后依次展示出来;

         三部电影就是三个对象,定义一个电影类,定义一个集合存储电影对象
    
         创建3个电影对象,封装相关数据,把3个对象存入到集合中去
    
    package com.java.test;
    
    import java.util.ArrayList;
    
    public class ArrayListStore {
        public static void main(String[] args) {
            // 1. 定义一个电影类:Movie
            // 2. 定义一个ArrayList集合存储这些影片对象
            ArrayList<Movies> movies = new ArrayList<>();
    
            // 3. 创建影片对象封装电影数据,把对象加入到集合中去
            /*
            Movies m1 = new Movies("《2012》",8.7,"罗宾");
            movies.add(m1);
             */
            movies.add(new Movies("《肖申克的救赎》", 9.7, "罗宾"));
            movies.add(new Movies("《霸王别姬》", 6.6, "张国"));
            movies.add(new Movies("《美丽人生》", 9.8, "大卫"));
    
            // 4. 遍历集合中的影片对象并展示出来(集合装载对象,对象装载地址,直接打印集合只会得到地址)
            for (int i = 0; i < movies.size(); i++) {
                // movies.get(i)取得是每一个影片对象的地址,用一个影片类型的变量接收
                // 变量获得了地址,打印变量时会去访问这个地址   
                Movies movie = movies.get(i);
                System.out.println("片名:" + movie.getName());
                System.out.println("评分:" + movie.getScore());
                System.out.println("主演:" + movie.getActor());
            }
    
        }
    }
    
    package com.java.test;
    
    public class Movies {
        private String name;
        private double score;
        private String actor;
    
        public Movies() {
        }
    
        public Movies(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;
        }
    }
    
    

ArrayList元素搜索

  • 需求:后台程序需要存储学生信息并展示,然后要提供学号搜索学生信息的功能
package com.java.test;

public class Student {
    private String id;
    private String name;
    private int age;
    private String sex;

    public Student() {
    }

    public Student(String id, String name, int age, String sex) {
        this.id = id;
        this.name = name;
        this.age = age;
        this.sex = sex;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    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 getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }
}
package com.java.test;

import java.util.ArrayList;
import java.util.Scanner;

public class ArrayListStudent {
    public static void main(String[] args) {
        ArrayList<Student> students = new ArrayList();
        Student stu1 = new Student("0001", "王宝强", 30, "男");
        students.add(stu1);
        Student stu2 = new Student("0002", "陈羽凡", 31, "女");
        students.add(stu2);
        Student stu3 = new Student("0003", "贾乃亮", 32, "男");
        students.add(stu3);
        Student stu4 = new Student("0004", "谢霆锋", 33, "女");
        students.add(stu4);

        // 遍历已经存储进来的学生信息
        for (int i = 0; i < students.size(); i++) {
            Student stu = students.get(i);
            System.out.print("学号:" + stu.getId() + "\t");
            System.out.print("姓名:" + stu.getName() + "\t");
            System.out.print("年龄:" + stu.getAge() + "\t");
            System.out.print("性别:" + stu.getSex() + "\t");
            System.out.println();
        }
        Scanner scanner = new Scanner(System.in);

        while (true) {
            System.out.println("输入学号查询学生信息:");
            String Id = scanner.next();
            Student s = getStudentById(students, Id);
            //判断学号是否拥有地址,即是否存在
            if (s == null) {
                System.out.println("查无此人");
            } else {//返回的是对象,通过对象调用方法获得信息
                System.out.println("学号:" + s.getId());
                System.out.println("姓名:" + s.getName());
                System.out.println("年龄:" + s.getAge());
                System.out.println("性别:" + s.getSex());
            }
        }

    }

    public static Student getStudentById(ArrayList<Student> students, String strId) {
        for (int i = 0; i < students.size(); i++) {
            Student s = students.get(i);
            if (s.getId().equals(strId)) {
                return s;
            }
        }
        return null;    // 查无此学号
    }
}
  • 分析:
    1. 定义Student类,定义ArrayList集合存储学生对象信息,并遍历出来
    2. 提供一个方法,可以接收ArrayList集合,和要搜索的学号,返回搜索到的学生对象信息并展示
    3. 使用死循环,让用户不停的搜索

相关文章

网友评论

      本文标题:11.常用API—ArrayList

      本文链接:https://www.haomeiwen.com/subject/czfocrtx.html