Java 9+ 双向映射最佳简单Java对象数据结构咨询
Java 9+ 实现双向映射的最佳简单对象方案
对于双向映射需求,最适合的方案是自定义一个封装两个HashMap的工具类,利用HashMap的O(1)查找特性,避免枚举遍历的低效问题。下面是具体实现:
1. 定义映射对实体类
先创建简单的实体类存储双向映射的两个术语:
public class TermPair { private final String term1; private final String term2; public TermPair(String term1, String term2) { this.term1 = term1; this.term2 = term2; } public String getTerm1() { return term1; } public String getTerm2() { return term2; } @Override public String toString() { return "[" + term1 + ", " + term2 + "]"; } }
2. 实现双向映射容器
封装两个HashMap分别维护双向映射关系,保证双向查找的高效性:
import java.util.HashMap; import java.util.Map; public class BiDirectionalMap { private final Map<String, TermPair> term1Map = new HashMap<>(); private final Map<String, TermPair> term2Map = new HashMap<>(); // 添加映射,处理重复键冲突 public void addMapping(String term1, String term2) { if (term1Map.containsKey(term1) || term2Map.containsKey(term2)) { throw new IllegalArgumentException("Term already exists in mapping"); } TermPair pair = new TermPair(term1, term2); term1Map.put(term1, pair); term2Map.put(term2, pair); } public TermPair findByTerm1(String term1) { return term1Map.get(term1); } public TermPair findByTerm2(String term2) { return term2Map.get(term2); } }
3. 使用示例
public class Main { public static void main(String[] args) { BiDirectionalMap map = new BiDirectionalMap(); map.addMapping("cat", "katze"); map.addMapping("dog", "hund"); System.out.println(map.findByTerm1("cat")); // 输出 [cat, katze] System.out.println(map.findByTerm2("hund")); // 输出 [dog, hund] } }
为什么不用枚举?
枚举的反向查找必须遍历所有值,时间复杂度为O(n),当映射对数量较多时性能会明显下降。而双HashMap方案的正反向查找都是O(1)复杂度,效率更高,同时支持动态添加映射(枚举是静态不可变的)。如果是固定映射,也可以在类初始化时一次性加载所有数据,同样能保证查找效率。
内容的提问来源于stack exchange,提问作者midnight
相关产品推荐
相关产品推荐

