应使用hashmap统计票数、hashset防重复投票、list排序按value降序:hashmap用merge方法单次遍历o(n),hashset服务端校验add返回值,排序需转entryset为list后按getvalue降序。

用 HashMap 存候选人与票数,别用 ArrayList 反复遍历
直接遍历列表统计每张票对应谁,时间复杂度是 O(n×m),候选人一多、票一多就卡顿。用 HashMap<string integer></string> 以姓名为键、票数为值,单次遍历就能完成计票:map.merge(candidate, 1, Integer::sum) 是最简洁写法,比先 get() 再 put() 安全,自动处理 null 键。
防止重复投票:用 HashSet 记录已投票用户 ID
仅靠前端限制或简单判断“用户名不为空”拦不住重复提交。必须在服务端维护一个 HashSet<string></string>(如存用户手机号或 token 哈希),每次投票前调用 set.add(userId) —— 它返回 false 表示已存在,此时直接拒绝。注意:内存集合只适合单机轻量场景;分布式部署必须换成 Redis 的 SET 加 EXPIRE 过期控制。
按票数排序时别直接对 HashMap 排序
HashMap 本身无序,TreeMap 按 key 排,不是按 value。正确做法是把 entrySet() 转成 list 后用 sorted() + Comparator.comparingInt(Map.Entry::getValue).reversed()。如果候选人少(stream() 没问题;若数据量大且频繁查询,提前缓存排序结果,避免每次响应都重排。
投票结果输出要防 ConcurrentModificationException
多个线程同时读写同一个 HashMap 或 HashSet 会崩溃。不要用 Collections.synchronizedMap() 简单包一层——它只保证单个操作原子,size() 后再 entrySet() 仍可能出错。要么用 ConcurrentHashMap,要么对读操作加 synchronized 块(锁整个统计对象而非 map 本身)。另外,打印结果时别在循环里调用 System.out.println() 多次,拼成一个字符串再输出,减少 I/O 竞争。
立即学习“Java免费学习笔记(深入)”;










