简易投票系统是Java基础学习的实用练手项目,不需要依赖额外的框架或数据库,仅用核心类库就能实现完整功能。下面我们一步步拆解实现逻辑。

核心设计思路
整个系统围绕三个核心部分展开:
- 投票选项管理:用键值对结构存储选项内容和当前票数
- 用户交互逻辑:通过控制台接收用户的投票选择、查询请求
- 数据一致性保障:如果是多线程场景,需要保证票数修改的线程安全
基础版单线程实现
先实现不需要考虑并发的基础版本,适合单用户操作的场景。
1. 初始化投票选项
我们用HashMap<String, Integer>存储选项,键是选项名称,值是当前票数。
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
public class SimpleVoteSystem {
// 存储投票选项和对应票数
private Map<String, Integer> voteOptions = new HashMap<>();
private Scanner scanner = new Scanner(System.in);
// 初始化投票选项
public void initOptions() {
voteOptions.put("选项A:最佳设计奖", 0);
voteOptions.put("选项B:最佳功能奖", 0);
voteOptions.put("选项C:最佳体验奖", 0);
voteOptions.put("选项D:最佳创新奖", 0);
}
}2. 实现投票功能
用户选择对应的选项编号,系统自动给对应选项加1票,同时做输入合法性校验。
// 执行投票操作
public void vote() {
System.out.println("请输入要投票的选项编号(1-4):");
System.out.println("1. 选项A:最佳设计奖");
System.out.println("2. 选项B:最佳功能奖");
System.out.println("3. 选项C:最佳体验奖");
System.out.println("4. 选项D:最佳创新奖");
String input = scanner.nextLine();
String targetOption = "";
switch (input) {
case "1":
targetOption = "选项A:最佳设计奖";
break;
case "2":
targetOption = "选项B:最佳功能奖";
break;
case "3":
targetOption = "选项C:最佳体验奖";
break;
case "4":
targetOption = "选项D:最佳创新奖";
break;
default:
System.out.println("输入无效,请重新选择");
return;
}
// 票数加1
voteOptions.put(targetOption, voteOptions.get(targetOption) + 1);
System.out.println("投票成功,感谢您的参与!");
}3. 结果展示与程序入口
添加查看结果的方法,以及主函数循环接收用户操作。
// 展示当前投票结果
public void showResult() {
System.out.println("当前投票结果:");
for (Map.Entry<String, Integer> entry : voteOptions.entrySet()) {
System.out.println(entry.getKey() + ",当前票数:" + entry.getValue());
}
}
// 程序主入口
public static void main(String[] args) {
SimpleVoteSystem voteSystem = new SimpleVoteSystem();
voteSystem.initOptions();
Scanner scanner = new Scanner(System.in);
while (true) {
System.out.println("\n请选择操作:1. 投票 2. 查看结果 3. 退出系统");
String choice = scanner.nextLine();
switch (choice) {
case "1":
voteSystem.vote();
break;
case "2":
voteSystem.showResult();
break;
case "3":
System.out.println("系统已退出");
return;
default:
System.out.println("无效操作,请重新选择");
}
}
}
}多线程场景优化
如果多个用户同时通过控制台操作(比如用多线程模拟多用户投票),基础版本的HashMap在并发修改时可能出现数据错误,需要改用ConcurrentHashMap保证线程安全,同时可以用AtomicInteger存储票数,避免手动加锁的复杂逻辑。
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicInteger;
public class ConcurrentVoteSystem {
// 线程安全的存储结构,AtomicInteger保证自增操作的原子性
private ConcurrentHashMap<String, AtomicInteger> voteOptions = new ConcurrentHashMap<>();
// 初始化选项
public void initOptions() {
voteOptions.put("选项A:最佳设计奖", new AtomicInteger(0));
voteOptions.put("选项B:最佳功能奖", new AtomicInteger(0));
voteOptions.put("选项C:最佳体验奖", new AtomicInteger(0));
voteOptions.put("选项D:最佳创新奖", new AtomicInteger(0));
}
// 线程安全的投票方法
public void vote(String optionName) {
AtomicInteger count = voteOptions.get(optionName);
if (count != null) {
count.incrementAndGet(); // 原子自增,无需额外加锁
System.out.println(Thread.currentThread().getName() + " 投票成功");
}
}
// 展示结果
public void showResult() {
System.out.println("当前投票结果:");
voteOptions.forEach((key, value) -> {
System.out.println(key + ",当前票数:" + value.get());
});
}
}扩展建议
如果需要在实际场景中使用,还可以做这些扩展:
- 添加投票用户身份校验,避免同一用户重复投票
- 将投票数据持久化到文件或数据库,避免程序重启后数据丢失
- 增加投票时间限制,到时间后自动停止投票并展示结果
- 添加选项新增、删除的管理功能,适配更多场景需求