Java09集合ArrayList

Java09集合基础

一、关于集合

1、什么是集合

集合是一种容器,用来装数据,类似于数组

Q:有数组,为什么还要学习集合?

A:数组定义完成并启用后,长度就固定了;而集合的大小可变,开发中用到的更多。

2、常见集合

3、ArrayList长度可变原理

  • 当创建ArrayList集合容器的时候,底层会存在一个长度为10个大小的空数组

  • 当存储空间不够需要扩容时,底层会自动创建一个新的扩容数组,大小为原数组的1.5倍,同时将原数组的数据都拷贝到新的扩容数组,并将新元素添加到新数组

4、集合和数组的使用选择

  • 数组:存储的元素个数固定不变

  • 集合:存储的元素个数经常发生改变

二、ArrayList基础入门

1、ArrayList集合的创建

格式:ArrayList<泛型> 集合变量名 = new ArrayList<泛型>();

注意:jdk7版本以后,new之后的<>中的泛型可省略不写,它自动匹配左边的类型

!!!泛型用来限制集合中存储的数据类型!!!

!!!泛型中不允许存储基本数据类型!!!

Q:如果需要存储基本数据类型怎么解决?

A:使用基本数据类型所对应的包装类

  • 8种基本数据类型及其对应的包装类

2、ArrayList集合常用成员方法

    • 将指定的元素添加到此集合的末尾

      public boolean add(E e)      //返回添加成功的状态,成功为true,失败为false;注意底层是没有失败的情况的
    • 在此集合中的指定位置插入指定的元素(插队添加)

      public void add(int index,E element)   //效果同插队,无返回值
    • 删除指定索引处的元素

      public E remove(int index)     //返回被删除的元素
    • 删除指定的元素

      public boolean remove(Object o)    //返回是否删除成功的状态
  • 修改指定索引处为对应元素

    public E set(int index,E element)      //返回被修改的元素
    • 返回指定索引处的元素

      public E get(int index)  
       
    • 返回集合中的元素个数

      public int size()

♥注意:增删改方法的返回值一般不做接收,但是查的返回值一定要接收,接收了才可以对查到的结果做进一步操作。

3、小demo

  • 集合删除元素

    需求:1、创建一个存储String的集合,内部存储(test,张三,李四,test,test)字符串 2、删除所有的test字符串,删除后,将集合剩余元素打印在控制台

    public class ArrayListTest3 {
        public static void main(String[] args) {
            ArrayList<String> list = new ArrayList<>();
            list.add("test");
            list.add("张三");
            list.add("李四");
            list.add("test");
            list.add("test");
    ​
            //正序遍历,调用remove方法后要记得i--
            for (int i = 0; i < list.size(); i++) {
                String s = list.get(i);
                if("test".equals(s)){
                    list.remove(i);
                    i--;
                }
            }
    ​
            //倒序遍历
            for (int i = list.size()-1; i >= 0; i--) {
                String s = list.get(i);
                if("test".equals(s)){
                    list.remove(i);
                }
            }
    ​
            System.out.println(list);
        }
    }

    ♥注意:在正序遍历删除集合元素的时候,由于集合的维护机制,当集合中某个元素被成功删除后,后续元素会依次前移,而i指针++可能会导致遗漏一些元素的检查。解决办法就是在成功删除后先让i--,回到上一个位置,这样当再次进入循环i++时能刚好检查到刚才被删元素的下一个元素。当然也可以采用倒序遍历,倒序遍历就不存在这种问题。

  • 集合元素筛选

  • 需求:1、定义一个方法,方法接收一个集合对象(泛型为Student

      2、方法内部将年龄低于18的学生对象找出

      3、将找到的对象存入新集合对象,方法返回新集合

  • public class ArrayListTest4 {
        public static void main(String[] args) {
            Student stu1 = new Student("Anna",23);
            Student stu2 = new Student("Tom",12);
            Student stu3 = new Student("Mary",20);
            Student stu4 = new Student("Jerry",25);
            Student stu5 = new Student("Bill",14);
    ​
            ArrayList<Student> list = new ArrayList<>();
            list.add(stu1);
            list.add(stu2);
            list.add(stu3);
            list.add(stu4);
            list.add(stu5);
    ​
            ArrayList<Student> newlist = filter(list);
    ​
            for (int i = 0; i < newlist.size(); i++) {
                Student student = newlist.get(i);
                System.out.println(student.getName()+","+student.getAge());
            }
        }
    ​
        private static ArrayList<Student> filter(ArrayList<Student> list) {
            ArrayList<Student> newlist = new ArrayList<>();
    ​
            for (int i = 0; i < list.size(); i++) {
                Student student = list.get(i);
                if(student.getAge()<18){
                    newlist.add(student);
                }
            }
            return newlist;
        }
    }

    分析助解

三、学生管理系统案例练习

1、分析思路图

2、代码实现

package com.itheima.start;
​
import domain.Student;
​
import java.util.ArrayList;
import java.util.Scanner;
​
/**
 * @Auther:Anna
 * @Date:2024/4/26-04-26-14:57
 * @Description:com.itheima.start
 * @version:1.0
 **/
public class start {
    public static void main(String[] args) {
​
        ArrayList<Student> list = new ArrayList<>();
​
  /*    用于测试功能的假数据  
        Student stu1 = new Student("heima001","张三", 23, "1999-11-11");
        Student stu2 = new Student("heima002","李四", 23, "1999-11-11");
        Student stu3 = new Student("heima003","王五", 23, "1999-11-11");
​
        list.add(stu1);
        list.add(stu2);
        list.add(stu3);*/
​
        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 sc = new Scanner(System.in);
            int choice = sc.nextInt();
​
            switch(choice){
                case 1 :
                    addStudent(list);
                    break;
                case 2 :
                    deleteStudentById(list);
                    break;
                case 3 :
                    updateStudentInfoById(list);
                    break;
                case 4 :
                    showStudentInfos(list);
                    break;
                case 5 :
                    System.out.println("感谢您的使用!再见");
                    System.exit(0);       //终止正在运行的JVM虚拟机
                default:
                    System.out.println("您的输入有误,请重新输入!");
                    break;
            }
​
        }
​
    }
​
​
    /**
     *此方法根据键盘录入学生信息并添加到集合
     */
    private static void addStudent(ArrayList<Student> list) {
        Scanner sc =new Scanner(System.in);
        System.out.println("请输入学生学号:");
        //提升变量的作用域
        String id;
        //while循环校验id
        while(true){
            id= sc.next();
            //判断学号唯一性
            int index = getIndex(id,list);
            if(index==-1){
                break;
            }else{
                System.out.println("学号已被占用,请重新输入!");
            }
        }
​
        System.out.println("请输入学生姓名 :");
        String name = sc.next();
        System.out.println("请输入学生年龄:");
        int age = sc.nextInt();
        System.out.println("请输入学生生日:");
        String birthday = sc.next();
        Student stu = new Student(id,name,age,birthday);
        list.add(stu);
    }
​
    /**
     *此方法根据id修改学生信息
     */
    private static void updateStudentInfoById(ArrayList<Student> list) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入要修改的学生id:");
        String id = sc.next();
​
        int index = getIndex(id,list);
        if(index==-1){
            System.out.println("查无此人,修改失败!");
        }else{
            System.out.println("请输入新的学生姓名:");
            String name = sc.next();
            System.out.println("请输入新的学生年龄:");
            int age = sc.nextInt();
            System.out.println("请输入新的学生生日:");
            String birthday = sc.next();
​
            Student stu = new Student(id,name,age,birthday);
            list.set(index,stu);
            System.out.println("修改成功!");
        }
    }
​
    /**
     *此方法根据id删除学生信息
     */
    private static void deleteStudentById(ArrayList<Student> list) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入要删除的学生id:");
        String id = sc.next();
​
        int index = getIndex(id,list);
        if(index==-1){
            System.out.println("查无此人,请重新输入!");
        }else{
            list.remove(index);
            System.out.println("删除成功!");
        }
    }
​
    /**
     *此方法用于通过学号id获取索引
     */
    private static int getIndex(String id, ArrayList<Student> list) {
        for (int i = 0; i < list.size(); i++) {
            Student stu = list.get(i);
            if(id.equals(stu.getId())){
                return i;
            }
        }
        return -1;
    }
​
    /**
     * 此方法用于查看学生
     */
    private static void showStudentInfos(ArrayList<Student> list) {
        if(list.size()==0){
            System.out.println("查无信息,请添加后重试!");
        }else{
            //遍历集合,取出学生对象
            System.out.println("学号\t\t\t姓名\t年龄\t生日");
            for (int i = 0; i < list.size(); i++) {
                Student stu = list.get(i);
                System.out.println(stu.getId()+"\t"+stu.getName()+"\t"+stu.getAge()+"\t"+stu.getBirthday() );
            }
        }
    }
}
​

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值