数组:最基础的数据存储方式
在开发一个学生成绩管理系统时,最开始可能只是想把几个分数存起来看看平均值。这时候用数组是最直接的办法。Java中的数组一旦创建大小就固定了,适合那种数据量明确、变动不大的场景。
int[] scores = {85, 92, 78, 96, 88};
int sum = 0;
for (int score : scores) {
sum += score;
}
double average = (double) sum / scores.length;
System.out.println("平均分:" + average);
ArrayList:动态扩容更灵活
后来系统要支持随时添加新学生,数组的固定长度就成了瓶颈。换成ArrayList,就不需要提前确定容量,添加元素时自动扩容,写起来也更顺手。
import java.util.ArrayList;
ArrayList<String> students = new ArrayList<>();
students.add("张三");
students.add("李四");
students.add("王五");
// 中间插入
students.add(1, "赵六");
System.out.println(students); // [张三, 赵六, 李四, 王五]
链表的实际用途:处理不确定顺序的操作
有次接到需求,要做一个任务队列,某些任务可以插队,有些要取消。用LinkedList比ArrayList更适合,因为它的插入和删除效率更高,不需要像数组那样整体移动元素。
import java.util.LinkedList;
LinkedList<String> tasks = new LinkedList<>();
tasks.add("生成报表");
tasks.add("备份数据");
tasks.add("发送邮件");
// 紧急任务插队
tasks.addFirst("修复线上bug");
// 取消最后一个任务
tasks.removeLast();
System.out.println("当前任务列表:" + tasks);
栈的应用:撤销操作怎么实现
做一个简单的文本编辑器时,用户希望按Ctrl+Z能一步步撤回输入。这种“后进先出”的逻辑,正好用栈来处理。Java里可以用ArrayDeque当栈用,比老的Stack类性能更好。
import java.util.ArrayDeque;
ArrayDeque<String> history = new ArrayDeque<>();
history.push("第一次输入:Hello");
history.push("第二次输入:World");
history.push("第三次修改:Hello World!");
// 撤销
String lastAction = history.pop();
System.out.println("撤销:" + lastAction);
队列:处理排队请求
在做一个在线抢课系统时,大量用户同时提交选课请求。不能一下子全处理,得按顺序来。用Queue把请求排起来,一个个消费,避免服务器被压垮。
import java.util.LinkedList;
import java.util.Queue;
Queue<String> requests = new LinkedList<>();
requests.offer("用户A选课:数学");
requests.offer("用户B选课:英语");
requests.offer("用户C选课:物理");
while (!requests.isEmpty()) {
String req = requests.poll();
System.out.println("正在处理:" + req);
}