在Java原生数组中,长度一旦定义就无法修改,这给需要频繁增减元素的场景带来了不便。通过菜单系统配合数组扩容、元素移动等逻辑,我们可以实现数组元素的动态管理,满足灵活操作的需求。

核心实现思路
动态管理数组的核心在于当数组容量不足时进行扩容,当元素被删除时进行元素前移,同时维护一个记录当前有效元素数量的变量。菜单系统则通过循环接收用户输入的选项,调用对应的数组操作方法。
基础变量定义
首先需要定义原始数组、有效元素计数器和扫描器对象,代码如下:
import java.util.Scanner;
public class DynamicArrayMenu {
// 初始数组容量
private static final int INIT_CAPACITY = 5;
// 存储元素的数组
private static int[] arr = new int[INIT_CAPACITY];
// 当前有效元素数量
private static int size = 0;
// 扫描器对象,用于接收用户输入
private static Scanner scanner = new Scanner(System.in);
}数组扩容方法
当数组已满需要添加新元素时,创建一个容量更大的新数组,将原数组元素拷贝过去,再让原数组引用指向新数组:
private static void expandArray() {
// 扩容为原数组的2倍
int newCapacity = arr.length * 2;
int[] newArr = new int[newCapacity];
// 拷贝原数组元素到新数组
for (int i = 0; i < arr.length; i++) {
newArr[i] = arr[i];
}
// 原数组引用指向新数组
arr = newArr;
System.out.println("数组已扩容,当前容量:" + newCapacity);
}添加元素方法
添加元素前先判断数组是否已满,满了则先扩容,再将新元素放到有效元素的末尾,有效元素数量加一:
private static void addElement() {
System.out.print("请输入要添加的整数:");
int num = scanner.nextInt();
// 判断数组是否已满
if (size == arr.length) {
expandArray();
}
arr[size] = num;
size++;
System.out.println("元素添加成功");
}删除元素方法
删除元素需要先找到目标元素的位置,然后将该位置之后的元素逐个前移,最后有效元素数量减一:
private static void deleteElement() {
if (size == 0) {
System.out.println("当前数组为空,无法删除元素");
return;
}
System.out.print("请输入要删除的整数:");
int target = scanner.nextInt();
int index = -1;
// 查找目标元素的位置
for (int i = 0; i < size; i++) {
if (arr[i] == target) {
index = i;
break;
}
}
if (index == -1) {
System.out.println("未找到目标元素");
return;
}
// 元素前移
for (int i = index; i < size - 1; i++) {
arr[i] = arr[i + 1];
}
size--;
System.out.println("元素删除成功");
}查询与修改方法
查询方法遍历数组输出所有有效元素,修改方法先查找目标元素再替换其值:
private static void queryElements() {
if (size == 0) {
System.out.println("当前数组为空");
return;
}
System.out.print("当前数组元素:");
for (int i = 0; i < size; i++) {
System.out.print(arr[i] + " ");
}
System.out.println();
}
private static void updateElement() {
if (size == 0) {
System.out.println("当前数组为空,无法修改元素");
return;
}
System.out.print("请输入要修改的原整数:");
int oldNum = scanner.nextInt();
int index = -1;
for (int i = 0; i < size; i++) {
if (arr[i] == oldNum) {
index = i;
break;
}
}
if (index == -1) {
System.out.println("未找到目标元素");
return;
}
System.out.print("请输入新的整数:");
int newNum = scanner.nextInt();
arr[index] = newNum;
System.out.println("元素修改成功");
}菜单系统整合
将各个功能方法整合到主函数的循环菜单中,持续接收用户操作直到用户选择退出:
public static void main(String[] args) {
int choice;
do {
System.out.println("\n===== 动态数组管理菜单 =====");
System.out.println("1. 添加元素");
System.out.println("2. 删除元素");
System.out.println("3. 查询所有元素");
System.out.println("4. 修改元素");
System.out.println("5. 退出系统");
System.out.print("请输入你的选择:");
choice = scanner.nextInt();
switch (choice) {
case 1:
addElement();
break;
case 2:
deleteElement();
break;
case 3:
queryElements();
break;
case 4:
updateElement();
break;
case 5:
System.out.println("系统已退出");
break;
default:
System.out.println("无效的选择,请重新输入");
}
} while (choice != 5);
scanner.close();
}注意事项
- 数组扩容时尽量选择合适的扩容倍数,避免频繁扩容影响性能
- 删除元素时要先判断数组是否为空,避免空指针或无效操作
- 修改元素时要先确认目标元素存在,否则给出对应提示
- 使用完
Scanner对象后要及时关闭,释放资源