在公交调度、出行查询等业务场景中,我们常常需要建立站点与对应公交线路的映射关系,方便后续快速查询某个站点停靠的所有线路。这种映射的核心需求是支持高效插入和查询,Java中有多种实现方式,下面介绍两种常用的高效实现方案。

方案一:基于HashMap手动维护集合
这种方式是最基础的实现思路,先初始化一个HashMap,键为站点标识,值为该站点对应的公交线路集合。每次插入线路和站点的对应关系时,先判断站点是否已经在Map中存在,若不存在则新建集合再放入线路,若已存在则直接往集合中添加线路。
实现代码如下:
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class BusRouteMapDemo1 {
public static void main(String[] args) {
// 初始化映射,键是站点ID,值是该站点的公交线路列表
Map<String, List<String>> stationRouteMap = new HashMap<>();
// 模拟插入站点与线路的对应关系:线路101经过站点A、站点B
addRouteToStation(stationRouteMap, "A", "101路");
addRouteToStation(stationRouteMap, "B", "101路");
// 线路202经过站点A、站点C
addRouteToStation(stationRouteMap, "A", "202路");
addRouteToStation(stationRouteMap, "C", "202路");
// 查询站点A对应的所有线路
System.out.println("站点A的公交线路:" + stationRouteMap.get("A"));
}
private static void addRouteToStation(Map<String, List<String>> map, String station, String route) {
// 判断站点是否已有对应的线路集合
if (!map.containsKey(station)) {
// 不存在则新建ArrayList存放线路
List<String> routeList = new ArrayList<>();
routeList.add(route);
map.put(station, routeList);
} else {
// 存在则直接往集合中添加线路
map.get(station).add(route);
}
}
}
方案优缺点
- 优点:逻辑清晰直观,容易理解,适合刚接触Java集合的新手学习
- 缺点:每次插入都需要先判断键是否存在,代码存在冗余的判空逻辑,当插入操作频繁时,重复的containsKey和get调用会有一定的性能损耗
方案二:使用computeIfAbsent简化逻辑
Java 8为Map接口新增了computeIfAbsent方法,该方法会在键不存在时,通过传入的函数计算对应的值并放入Map,若键已存在则直接返回已有的值。利用这个方法可以大幅简化站点映射的构建逻辑,减少冗余判断。
实现代码如下:
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class BusRouteMapDemo2 {
public static void main(String[] args) {
// 初始化映射
Map<String, List<String>> stationRouteMap = new HashMap<>();
// 插入对应关系,无需手动判断站点是否存在
addRouteToStation(stationRouteMap, "A", "101路");
addRouteToStation(stationRouteMap, "B", "101路");
addRouteToStation(stationRouteMap, "A", "202路");
addRouteToStation(stationRouteMap, "C", "202路");
// 查询站点A对应的所有线路
System.out.println("站点A的公交线路:" + stationRouteMap.get("A"));
}
private static void addRouteToStation(Map<String, List<String>> map, String station, String route) {
// computeIfAbsent:键不存在时新建ArrayList,存在时直接返回已有集合
map.computeIfAbsent(station, k -> new ArrayList<>()).add(route);
}
}
方案优缺点
- 优点:代码简洁,一行逻辑完成判空和插入操作,减少了重复的Map查询操作,性能更优
- 缺点:需要了解Java 8的函数式接口用法,对新手来说理解成本稍高
两种方式对比
我们可以通过下表对比两种实现方式的差异:
| 对比维度 | 手动维护集合方式 | computeIfAbsent方式 |
|---|---|---|
| 代码行数 | 较多,需要显式判空 | 较少,逻辑高度简化 |
| Map查询次数 | 每次插入至少2次(containsKey+get) | 每次插入1次(computeIfAbsent内部优化) |
| 适用场景 | Java 8以下版本,或需要清晰展示逻辑的场景 | Java 8及以上版本,追求代码简洁和性能的场景 |
总结
两种实现方式都能高效完成站点到公交线路集合的映射构建,核心都是利用HashMap的O(1)查询特性保证查询效率。如果是维护老项目或者需要代码逻辑更直观,可以选择第一种手动维护的方式;如果是新项目且使用Java 8及以上版本,推荐使用第二种computeIfAbsent的方式,既能减少代码量,也能提升插入操作的性能。在实际开发中,还可以根据需求选择使用HashSet存储线路,避免同一线路重复插入到同一个站点的集合中。