Java 我们使用BiMap解决的问题

Java 我们使用BiMap解决的问题,java,guava,bimap,Java,Guava,Bimap,我正在回顾Google Guava API的功能,我遇到了一个在我的“现实编程”经验中从未见过的数据结构,即BiMap。这种构造的唯一好处是能够快速检索给定值的键吗?在使用BiMap最好地表达解决方案时,是否存在任何问题?任何时候,您都可以在不必填充两个映射的情况下执行反向查找。例如,您希望按姓名查找电话号码的电话目录,但也希望进行反向查找以从号码中获取姓名。Louis提到了在BiMap实现中可能节省的内存。这是包装两个Map实例所不能得到的唯一东西。但是,如果让我们为您包装映射实例。(你可以自

我正在回顾Google Guava API的功能,我遇到了一个在我的“现实编程”经验中从未见过的数据结构,即BiMap。这种构造的唯一好处是能够快速检索给定值的键吗?在使用BiMap最好地表达解决方案时,是否存在任何问题?

任何时候,您都可以在不必填充两个映射的情况下执行反向查找。例如,您希望按姓名查找电话号码的电话目录,但也希望进行反向查找以从号码中获取姓名。

Louis提到了在
BiMap
实现中可能节省的内存。这是包装两个
Map
实例所不能得到的唯一东西。但是,如果让我们为您包装
映射
实例。(你可以自己处理所有这些,但为什么要麻烦呢?:)

  • 如果调用
    put(newKey,existingValue)
    ,我们将立即出错以保持两个映射同步,而不是在意识到条目与另一个映射中的现有映射冲突之前将其添加到一个映射中。(如果要覆盖现有值,我们提供
    forcePut
    )我们为插入
    null
    或其他无效值提供类似的保护措施
  • BiMap
    视图使两个映射保持同步:如果从原始
    BiMap
    entrySet
    中删除一个元素,则其相应的条目也将从反向中删除。我们在
    Entry.setValue
    中做同样的事情
  • 我们处理序列化:一个
    BiMap
    及其反向保持“连接”,并且条目只序列化一次
  • 我们提供了
    inverse()
    的智能实现,以便
    foo.inverse().inverse()
    返回
    foo
    ,而不是包装器的包装器
  • 我们重写
    values()
    以返回一个
    Set
    。此集合与您从
    inverse().keySet()
    中获得的相同,只是它保持与原始
    BiMap
    相同的迭代顺序

如果没有两张地图,这怎么办?当然BiMap必须使用两个映射并隐藏这个事实?是的,它可能使用两个映射,但您不必填充两个映射并管理所有这些。@digitaljoel:不可能,它会。请看@jlordo,@AmirAfghani:这是一个老版本番石榴的克隆。当前实现的
HashBiMap
,正在保存。(
ImmutableBiMap
类似。)不用担心。(HashBiMap的重写也是超新的,一两周前才与Guava 14一起发布。而且,我是重写它的人,所以我对这些东西特别感兴趣。)