1.ArrayList

集合和数组的优势对比:

  1. 长度可变
  2. 添加数据的时候不需要考虑索引,默认将数据添加到末尾

1.1 ArrayList类概述

  • 什么是集合
    提供一种存储空间可变的存储模型,存储的数据容量可以发生改变
  • ArrayList集合的特点
    长度可以变化,只能存储引用数据类型。
  • 泛型的使用
    用于约束集合中存储元素的数据类型

1.2 ArrayList类常用方法

1.2.1 构造方法

方法名 说明
public ArrayList() 创建一个空的集合对象

1.2.2 成员方法

方法名 说明
public boolean add(要添加的元素) 将指定的元素追加到此集合的末尾
public boolean remove(要删除的元素) 删除指定元素,返回值表示是否删除成功
public E remove(int index) 删除指定索引处的元素,返回被删除的元素
public E set(int index,E element) 修改指定索引处的元素,返回被修改的元素
public E get(int index) 返回指定索引处的元素
public int size() 返回集合中的元素的个数

1.2.3 示例代码

  1. public class ArrayListDemo02 {
  2. public static void main(String[] args) {
  3. //创建集合
  4. ArrayList<String> array = new ArrayList<String>();
  5. //添加元素
  6. array.add("hello");
  7. array.add("world");
  8. array.add("java");
  9. //public boolean remove(Object o):删除指定的元素,返回删除是否成功
  10. // System.out.println(array.remove("world"));
  11. // System.out.println(array.remove("javaee"));
  12. //public E remove(int index):删除指定索引处的元素,返回被删除的元素
  13. // System.out.println(array.remove(1));
  14. //IndexOutOfBoundsException
  15. // System.out.println(array.remove(3));
  16. //public E set(int index,E element):修改指定索引处的元素,返回被修改的元素
  17. // System.out.println(array.set(1,"javaee"));
  18. //IndexOutOfBoundsException
  19. // System.out.println(array.set(3,"javaee"));
  20. //public E get(int index):返回指定索引处的元素
  21. // System.out.println(array.get(0));
  22. // System.out.println(array.get(1));
  23. // System.out.println(array.get(2));
  24. //System.out.println(array.get(3)); //?????? 自己测试
  25. //public int size():返回集合中的元素的个数
  26. System.out.println(array.size());
  27. //输出集合
  28. System.out.println("array:" + array);
  29. }
  30. }

1.3 ArrayList存储字符串并遍历

1.3.1 案例需求

  1. 创建一个存储字符串的集合,存储3个字符串元素,使用程序实现在控制台遍历该集合

1.3.2 代码实现

  1. public class ArrayListDemo3 {
  2. public static void main(String[] args) {
  3. //1.创建集合对象
  4. ArrayList<String> list = new ArrayList<>();
  5. //2.添加元素
  6. list.add("aaa");
  7. list.add("bbb");
  8. list.add("ccc");
  9. list.add("ddd");
  10. //3.遍历
  11. //快捷键: list.fori 正向遍历
  12. //list.forr 倒着遍历
  13. System.out.print("[");
  14. for (int i = 0; i < list.size(); i++) {
  15. //i 依次表示集合里面的每一个索引
  16. if(i == list.size() - 1){
  17. //最大索引
  18. System.out.print(list.get(i));
  19. }else{
  20. //非最大索引
  21. System.out.print(list.get(i) + ", ");
  22. }
  23. }
  24. System.out.print("]");
  25. }
  26. }

1.4 ArrayList存储学生对象并遍历

1.4.1 案例需求

  1. 创建一个存储学生对象的集合,存储3个学生对象,使用程序实现在控制台遍历该集合

1.4.2 代码实现

  1. public class ArrayListDemo4 {
  2. public static void main(String[] args) {
  3. //1.创建集合对象,用来存储数据
  4. ArrayList<Student> list = new ArrayList<>();
  5. //2.创建学生对象
  6. Student s1 = new Student("zhangsan",16);
  7. Student s2 = new Student("lisi",15);
  8. Student s3 = new Student("wangwu",18);
  9. //3.把学生对象添加到集合中
  10. list.add(s1);
  11. list.add(s2);
  12. list.add(s3);
  13. //4.遍历
  14. for (int i = 0; i < list.size(); i++) {
  15. //i 依次表示集合中的每一个索引
  16. Student stu = list.get(i);
  17. System.out.println(stu.getName() + ", " + stu.getAge());
  18. }
  19. }
  20. }

1.5 查找用户的索引

需求:

1,main方法中定义一个集合,存入三个用户对象。

用户属性为:id,username,password

2,要求:定义一个方法,根据id查找对应的学生信息。

如果存在,返回索引

如果不存在,返回-1

代码示例:

  1. public class ArrayListDemo6 {
  2. public static void main(String[] args) {
  3. /*需求:
  4. 1,main方法中定义一个集合,存入三个用户对象。
  5. 用户属性为:id,username,password
  6. 2,要求:定义一个方法,根据id查找对应的学生信息。
  7. 如果存在,返回索引
  8. 如果不存在,返回-1*/
  9. //1.创建集合对象
  10. ArrayList<User> list = new ArrayList<>();
  11. //2.创建用户对象
  12. User u1 = new User("heima001", "zhangsan", "123456");
  13. User u2 = new User("heima002", "lisi", "1234");
  14. User u3 = new User("heima003", "wangwu", "1234qwer");
  15. //3.把用户对象添加到集合当中
  16. list.add(u1);
  17. list.add(u2);
  18. list.add(u3);
  19. //4.调用方法,通过id获取对应的索引
  20. int index = getIndex(list, "heima001");
  21. System.out.println(index);
  22. }
  23. //1.我要干嘛? 根据id查找对应的学生信息
  24. //2.我干这件事情需要什么才能完成? 集合 id
  25. //3.方法的调用处是否需要继续使用方法的结果?
  26. //要用必须返回,不要用可以返回也可以不返回
  27. //明确说明需要有返回值 int
  28. public static int getIndex(ArrayList<User> list, String id) {
  29. //遍历集合得到每一个元素
  30. for (int i = 0; i < list.size(); i++) {
  31. User u = list.get(i);
  32. String uid = u.getId();
  33. if(uid.equals(id)){
  34. return i;
  35. }
  36. }
  37. //因为只有当集合里面所有的元素都比较完了,才能断定id是不存在的。
  38. return -1;
  39. }
  40. }

1.6 判断用户的是否存在

  1. public class ArrayListDemo5 {
  2. public static void main(String[] args) {
  3. /* 需求:
  4. 1,main方法中定义一个集合,存入三个用户对象。
  5. 用户属性为:id,username,password
  6. 2,要求:定义一个方法,根据id查找对应的学生信息。
  7. 如果存在,返回true
  8. 如果不存在,返回false*/
  9. //1.定义集合
  10. ArrayList<User> list = new ArrayList<>();
  11. //2.创建对象
  12. User u1 = new User("heima001","zhangsan","123456");
  13. User u2 = new User("heima002","lisi","12345678");
  14. User u3 = new User("heima003","wangwu","1234qwer");
  15. //3.把用户对象添加到集合当中
  16. list.add(u1);
  17. list.add(u2);
  18. list.add(u3);
  19. //4.调用方法,查询id是否存在
  20. boolean result = contains(list, "heima001");
  21. System.out.println(result);
  22. }
  23. //定义在测试类中的方法需要加static
  24. //1.我要干嘛? 我要根据id查询学生是否存在
  25. //2.我干这件事情,需要什么才能完成? 集合 id
  26. //3.方法的调用处是否需要使用方法的结果?
  27. //如果要用,必须返回,如果不用,可以返回也可以不返回
  28. //但是本题明确说明需要返回
  29. public static boolean contains(ArrayList<User> list, String id){
  30. //循环遍历集合,得到集合里面的每一个元素
  31. //再进行判断
  32. for (int i = 0; i < list.size(); i++) {
  33. //i 索引 list.get(i); 元素
  34. User u = list.get(i);
  35. //判断id是否存在,我是拿着谁跟谁比较
  36. //需要把用户对象里面的id拿出来再进行比较。
  37. String uid = u.getId();
  38. if(id.equals(uid)){
  39. return true;//return 关键字:作用就是结束方法。
  40. }
  41. }
  42. //只有当集合里面所有的元素全部比较完毕才能认为是不存在的。
  43. return false;
  44. }
  45. }

2.学生管理系统

2.1学生管理系统实现步骤

  • 案例需求
    针对目前我们的所学内容,完成一个综合案例:学生管理系统。该系统主要功能如下:
    添加学生:通过键盘录入学生信息,添加到集合中
    删除学生:通过键盘录入要删除学生的学号,将该学生对象从集合中删除
    修改学生:通过键盘录入要修改学生的学号,将该学生对象其他信息进行修改
    查看学生:将集合中的学生对象信息进行展示
    退出系统:结束程序
  • 实现步骤
    1. 定义学生类,包含以下成员变量
      private String sid // 学生id
      private String name // 学生姓名
      private String age // 学生年龄
      private String address // 学生所在地
    2. 学生管理系统主界面的搭建步骤
      2.1 用输出语句完成主界面的编写
      2.2 用Scanner实现键盘输入
      2.3 用switch语句完成选择的功能
      2.4 用循环完成功能结束后再次回到主界面
    3. 学生管理系统的添加学生功能实现步骤
      3.1 定义一个方法,接收ArrayList集合
      3.2 方法内完成添加学生的功能
      ①键盘录入学生信息
      ②根据录入的信息创建学生对象
      ③将学生对象添加到集合中
      ④提示添加成功信息
      3.3 在添加学生的选项里调用添加学生的方法
    4. 学生管理系统的查看学生功能实现步骤
      4.1 定义一个方法,接收ArrayList集合
      4.2 方法内遍历集合,将学生信息进行输出
      4.3 在查看所有学生选项里调用查看学生方法
    5. 学生管理系统的删除学生功能实现步骤
      5.1 定义一个方法,接收ArrayList集合
      5.2 方法中接收要删除学生的学号
      5.3 遍历集合,获取每个学生对象
      5.4 使用学生对象的学号和录入的要删除的学号进行比较,如果相同,则将当前学生对象从集合中删除
      5.5 在删除学生选项里调用删除学生的方法
    6. 学生管理系统的修改学生功能实现步骤
      6.1 定义一个方法,接收ArrayList集合
      6.2 方法中接收要修改学生的学号
      6.3 通过键盘录入学生对象所需的信息,并创建对象
      6.4 遍历集合,获取每一个学生对象。并和录入的修改学生学号进行比较.如果相同,则使用新学生对象替换当前学生对象
      6.5 在修改学生选项里调用修改学生的方法
    7. 退出系统
      使用System.exit(0);退出JVM

2.2学生类的定义

public class Student {
    //4个属性
    //学号
    private String sid;
    //姓名
    private String name;
    //年龄
    private String age;
    //居住地
    private String address;

    //下面生成空参构造,全参构造和getset方法


}

2.3测试类的定义

public class StudentManager {
    /*
        1:用输出语句完成主界面的编写
        2:用Scanner实现键盘录入数据
        3:用switch语句完成操作的选择
        4:用循环完成再次回到主界面
    */
    public static void main(String[] args) {
        //创建集合对象,用于保存学生数据信息
        ArrayList<Student> array = new ArrayList<Student>();

        //用循环完成再次回到主界面
        while (true) {
            //用输出语句完成主界面的编写
            System.out.println("--------欢迎来到学生管理系统--------");
            System.out.println("1 添加学生");
            System.out.println("2 删除学生");
            System.out.println("3 修改学生");
            System.out.println("4 查看所有学生");
            System.out.println("5 退出");
            System.out.println("请输入你的选择:");

            //用Scanner实现键盘录入数据
            Scanner sc = new Scanner(System.in);
            String choose = sc.next();

            //用switch语句完成操作的选择
            switch (choose) {
                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("谢谢使用");
                    System.exit(0); //JVM退出
            }
        }
    }

    //定义一个方法,用于添加学生信息
    public static void addStudent(ArrayList<Student> array) {
        //键盘录入学生对象所需要的数据,显示提示信息,提示要输入何种信息
        Scanner sc = new Scanner(System.in);

        String sid;

        while (true) {
            System.out.println("请输入学生学号:");
            sid = sc.next();

            boolean flag = isUsed(array, sid);
            if (flag) {
                System.out.println("你输入的学号已经被占用,请重新输入");
            } else {
                break;
            }
        }

        System.out.println("请输入学生姓名:");
        String name = sc.next();

        System.out.println("请输入学生年龄:");
        String age = sc.next();

        System.out.println("请输入学生居住地:");
        String address = sc.next();

        //创建学生对象,把键盘录入的数据赋值给学生对象的成员变量
        Student s = new Student();
        s.setSid(sid);
        s.setName(name);
        s.setAge(age);
        s.setAddress(address);

        //将学生对象添加到集合中
        array.add(s);

        //给出添加成功提示
        System.out.println("添加学生成功");
    }

    //定义一个方法,判断学号是否被使用
    public static boolean isUsed(ArrayList<Student> array, String sid) {
        //如果与集合中的某一个学生学号相同,返回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;
    }


    //定义一个方法,用于查看学生信息
    public static void findAllStudent(ArrayList<Student> array) {
        //判断集合中是否有数据,如果没有显示提示信息
        if (array.size() == 0) {
            System.out.println("无信息,请先添加信息再查询");
            //为了让程序不再往下执行,我们在这里写上return;
            return;
        }

        //显示表头信息
        //\t其实是一个tab键的位置
        System.out.println("学号\t\t\t姓名\t\t年龄\t\t居住地");

        //将集合中数据取出按照对应格式显示学生信息,年龄显示补充“岁”
        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());
        }
    }

    //定义一个方法,用于删除学生信息
    public static void deleteStudent(ArrayList<Student> array) {
        //键盘录入要删除的学生学号,显示提示信息
        Scanner sc = new Scanner(System.in);

        System.out.println("请输入你要删除的学生的学号:");
        String sid = sc.next();

        //在删除/修改学生操作前,对学号是否存在进行判断
        //如果不存在,显示提示信息
        //如果存在,执行删除/修改操作

        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("该信息不存在,请重新输入");
        } else {
            array.remove(index);
            //给出删除成功提示
            System.out.println("删除学生成功");
        }
    }

    //定义一个方法,用于修改学生信息
    public static void updateStudent(ArrayList<Student> array) {
        //键盘录入要修改的学生学号,显示提示信息
        Scanner sc = new Scanner(System.in);

        System.out.println("请输入你要修改的学生的学号:");
        String sid = sc.next();

        //键盘录入要修改的学生信息
        System.out.println("请输入学生新姓名:");
        String name = sc.next();
        System.out.println("请输入学生新年龄:");
        String age = sc.next();
        System.out.println("请输入学生新居住地:");
        String address = sc.next();

        //创建学生对象
        Student s = new Student();
        s.setSid(sid);
        s.setName(name);
        s.setAge(age);
        s.setAddress(address);

        //遍历集合修改对应的学生信息
        for (int i = 0; i < array.size(); i++) {
            Student student = array.get(i);
            if (student.getSid().equals(sid)) {
                array.set(i, s);
            }
        }

        //给出修改成功提示
        System.out.println("修改学生成功");
    }
}