Java 我们使用BiMap解决的问题
我正在回顾Google Guava API的功能,我遇到了一个在我的“现实编程”经验中从未见过的数据结构,即BiMap。这种构造的唯一好处是能够快速检索给定值的键吗?在使用BiMap最好地表达解决方案时,是否存在任何问题?任何时候,您都可以在不必填充两个映射的情况下执行反向查找。例如,您希望按姓名查找电话号码的电话目录,但也希望进行反向查找以从号码中获取姓名。Louis提到了在Java 我们使用BiMap解决的问题,java,guava,bimap,Java,Guava,Bimap,我正在回顾Google Guava API的功能,我遇到了一个在我的“现实编程”经验中从未见过的数据结构,即BiMap。这种构造的唯一好处是能够快速检索给定值的键吗?在使用BiMap最好地表达解决方案时,是否存在任何问题?任何时候,您都可以在不必填充两个映射的情况下执行反向查找。例如,您希望按姓名查找电话号码的电话目录,但也希望进行反向查找以从号码中获取姓名。Louis提到了在BiMap实现中可能节省的内存。这是包装两个Map实例所不能得到的唯一东西。但是,如果让我们为您包装映射实例。(你可以自
BiMap
实现中可能节省的内存。这是包装两个Map
实例所不能得到的唯一东西。但是,如果让我们为您包装映射
实例。(你可以自己处理所有这些,但为什么要麻烦呢?:)
- 如果调用
,我们将立即出错以保持两个映射同步,而不是在意识到条目与另一个映射中的现有映射冲突之前将其添加到一个映射中。(如果要覆盖现有值,我们提供put(newKey,existingValue)
)我们为插入forcePut
或其他无效值提供类似的保护措施null
视图使两个映射保持同步:如果从原始BiMap
的BiMap
中删除一个元素,则其相应的条目也将从反向中删除。我们在entrySet
中做同样的事情Entry.setValue
- 我们处理序列化:一个
及其反向保持“连接”,并且条目只序列化一次BiMap
- 我们提供了
的智能实现,以便inverse()
返回foo.inverse().inverse()
,而不是包装器的包装器foo
- 我们重写
以返回一个values()
。此集合与您从Set
中获得的相同,只是它保持与原始inverse().keySet()
相同的迭代顺序BiMap
HashBiMap
,正在保存。(ImmutableBiMap
类似。)不用担心。(HashBiMap的重写也是超新的,一两周前才与Guava 14一起发布。而且,我是重写它的人,所以我对这些东西特别感兴趣。)