Java 如何实现双向地图

Java 如何实现双向地图,java,algorithm,Java,Algorithm,我知道谷歌的guava甚至Apache commons都提供双向地图。然而,我想知道它们是如何实施的。从我发现的一点来看,最简单的方法是使用两个单独的映射来存储键/值和值/键数据。然而,肯定有更好的方法吗?谷歌的实施肯定不是这么简单吧?魔法在哪里 谢谢 仔细想想,一种双向映射实际上可以通过单个对象->对象映射来实现,将(键、值)对插入到映射中两次,每个方向一次。只要不需要显式的反向视图,它就可以工作。在键和值属于相同类型的情况下(允许同一对象成为键和值),给定键和值之间只能有一个映射(O1->O

我知道谷歌的guava甚至Apache commons都提供双向地图。然而,我想知道它们是如何实施的。从我发现的一点来看,最简单的方法是使用两个单独的映射来存储键/值和值/键数据。然而,肯定有更好的方法吗?谷歌的实施肯定不是这么简单吧?魔法在哪里


谢谢

仔细想想,一种双向映射实际上可以通过单个对象->对象映射来实现,将(键、值)对插入到映射中两次,每个方向一次。只要不需要显式的反向视图,它就可以工作。在键和值属于相同类型的情况下(允许同一对象成为键和值),给定键和值之间只能有一个映射(O1->O2表示O2->O1),而使用传统的双映射,可以有效地有两个(O1->O2与反向O2->O1和O3->O1与反向O1->O3)。但是对于许多双向映射需求,单一映射解决方案就足够了。

显然就是这样(Louis Wasserman)。

您可以看到Guava和/或Apache commons源代码。两者都是开源项目。你为什么不浏览一下他们的源代码呢?根据我的一点探索,番石榴使用了2个地图,例如,使用了putInBothMaps方法。但就是这样吗?还有什么东西隐藏起来了吗?在使用这些数据结构方面,我接触到了比我更有经验的任何人。写得好的数据结构应该简单明了。(请注意,我正在做的一些工作可能会让它更神奇…@Kraken:对于番石榴来说,它非常简单:你浏览javadoc,点击链接,最终你会看到源代码。或者转到项目的主页()并单击“源”选项卡。对于apache commons集合,您可以转到项目()的主页,并单击左侧栏中的“源存储库”。如果您在每个键上添加映射方向的指示,则可以不受限制地使用单个映射来完成此操作。因此,
双向映射
将通过
映射
实现,其中
是一个简单的对,
方向
是一个两值枚举。