You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Java的switch语句中向ArrayList添加值并保留数据?

问题原因

核心问题是每次调用menu()方法时,都会在方法内部重新创建ArrayList<String> cars局部变量——这意味着每次进入菜单操作,都是在一个全新的集合里执行添加/删除,之前操作的数据会随着旧方法栈帧的销毁而丢失。另外,递归调用menu()的方式不仅重复创建对象,还可能引发栈溢出风险。

解决方案

以下两种方案都能保证集合数据在多次菜单操作中持续保留:

方案一:将集合和Scanner设为类静态成员

把ArrayList和Scanner定义为类的静态变量,让所有menu()调用共享同一个实例,避免每次重新创建:

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

public class Eqla3tech {
    // 静态成员,所有menu调用共享同一个集合和输入流
    static ArrayList<String> cars = new ArrayList<>();
    static Scanner input = new Scanner(System.in);

    public static void main(String[] args) {
        menu();
    }

    static void menu() {
        System.out.println("Add Student <1>");
        System.out.println("remove Student <2>");
        System.out.println("show list of students <3>");
        System.out.println("how many students? <4>");
        System.out.println("Exit <5>"); // 新增退出选项,避免无限递归

        int num = input.nextInt();
        input.nextLine();

        switch(num) {
            case 1:
                System.out.println("write student name!!");
                cars.add(input.next());
                menu();
                break;
            case 2:
                System.out.println("what number of index of student to remove");
                int index = input.nextInt();
                // 增加索引合法性判断,避免报错
                if (index >= 0 && index < cars.size()) {
                    cars.remove(index);
                } else {
                    System.out.println("Invalid index!");
                }
                menu();
                break;
            case 3:
                System.out.println("Here's a list you have added.");
                System.out.println(cars);
                menu();
                break;
            case 4:
                System.out.println("Here's how many students");
                System.out.println(cars.size());
                menu();
                break;
            case 5:
                System.out.println("Exiting...");
                input.close();
                return; // 退出方法,结束程序
            default:
                System.out.println("Invalid option, try again!");
                menu();
                break;
        }
    }
}

方案二:用循环替代递归(更推荐)

递归调用menu()会不断创建方法栈帧,存在栈溢出风险。改用循环结构,在循环外创建集合和Scanner,让所有操作复用同一个实例:

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

public class Eqla3tech {
    public static void main(String[] args) {
        ArrayList<String> cars = new ArrayList<>();
        Scanner input = new Scanner(System.in);
        
        while (true) {
            System.out.println("Add Student <1>");
            System.out.println("remove Student <2>");
            System.out.println("show list of students <3>");
            System.out.println("how many students? <4>");
            System.out.println("Exit <5>");

            int num = input.nextInt();
            input.nextLine();

            switch(num) {
                case 1:
                    System.out.println("write student name!!");
                    cars.add(input.next());
                    break;
                case 2:
                    System.out.println("what number of index of student to remove");
                    int index = input.nextInt();
                    if (index >= 0 && index < cars.size()) {
                        cars.remove(index);
                    } else {
                        System.out.println("Invalid index!");
                    }
                    break;
                case 3:
                    System.out.println("Here's a list you have added.");
                    System.out.println(cars);
                    break;
                case 4:
                    System.out.println("Here's how many students");
                    System.out.println(cars.size());
                    break;
                case 5:
                    System.out.println("Exiting...");
                    input.close();
                    return;
                default:
                    System.out.println("Invalid option, try again!");
                    break;
            }
        }
    }
}
关键修改点说明
  • 共享集合实例:把ArrayList从方法局部变量提升为类静态成员,或者放在循环外部,确保所有操作都针对同一个集合。
  • 替换递归为循环:避免重复创建方法栈,提升程序稳定性和性能。
  • 增加合法性判断:添加索引越界的判断,防止删除操作抛出异常。
  • 新增退出选项:避免程序无限运行,提供正常退出的途径。

内容的提问来源于stack exchange,提问作者user7066458

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 22:22:51