guava的bimap通过inverse()获取逻辑反向视图,共享底层数据且保持双向一致性;需独立副本时用immutablebimap.inverse(),需可变独立副本则手动构造hashbimap。

Guava 的 BiMap 本身不提供“反转键值对”的方法,但它的核心特性就是支持**双向查找**——即通过键查值,也通过值查键。所谓“键值反转”,其实是创建一个新 BiMap,把原 map 的值作为新 map 的键、原 map 的键作为新 map 的值。Guava 提供了便捷方式实现这一点。
用 inverse() 方法直接获取反向视图
BiMap.inverse() 返回的是原 map 的**逻辑反向视图**(不是新副本),它共享底层数据。修改反向视图等同于修改原 map,且仍保持双向一致性。
- 调用后得到的仍是
BiMap<v k></v>类型,可直接使用 - 不能单独修改反向视图的键(因为值在原 map 中必须唯一),否则会抛
IllegalArgumentException - 适合读多写少、需要临时双向访问的场景
用 ImmutableBiMap 构建不可变的反转副本
如果需要一个独立、不可变的反转 map(避免影响原 map),推荐用 ImmutableBiMap:
-
ImmutableBiMap.copyOf(originalBiMap).inverse()→ 返回新的不可变反向 map - 或显式构建:
ImmutableBiMap.<v>builder().putAll(originalBiMap.inverse()).build()</v> - 适用于配置初始化、缓存、测试等需隔离数据的场景
手动构造新 BiMap 实现完全独立反转
若需可变、独立、可后续修改的反转 map,可用 HashBiMap.create() 并遍历填充:
BiMap<v k> reversed = HashBiMap.create();</v>originalBiMap.forEach((k, v) -> reversed.put(v, k));- 注意:确保原 map 的所有值都互不相同,否则 put 会失败(BiMap 要求值唯一)
- 适合需要后续增删改反转 map 的业务逻辑
常见误区提醒
不要尝试用普通 HashMap 手动 swap 键值——会丢失 BiMap 的约束保障;也不要对 inverse() 视图调用 clear() 或 put() 破坏双向一致性。真正需要“反转结果”时,优先选 inverse() 视图或 ImmutableBiMap,兼顾安全与简洁。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











