Java 谷歌收藏中BiMap的精髓

Java 谷歌收藏中BiMap的精髓,java,data-structures,guava,Java,Data Structures,Guava,我仍然对这件事感到困惑。据称,两个BIMAP由相同的数据支持;对其中一项的任何更改都将显示在另一项中。 我浏览了源代码,在ForwardingMap中找到了delegate的用法。但是在StandardBiMap的任何实际子类中,我确实看到数据被放入正向和反向映射中。那么本质是什么呢?为什么它声称只保留了一份数据就节省了空间?只是实际对象是一个集合,但仍然需要对这些对象的两组不同的引用,一组在正向映射中维护,另一组在反向映射中维护?BiMap的本质是什么?与客户维护太多单独的地图并进行相应更新的

我仍然对这件事感到困惑。据称,两个BIMAP由相同的数据支持;对其中一项的任何更改都将显示在另一项中。

我浏览了源代码,在
ForwardingMap
中找到了delegate的用法。但是在
StandardBiMap
的任何实际子类中,我确实看到数据被放入正向和反向映射中。那么本质是什么呢?为什么它声称只保留了一份数据就节省了空间?只是实际对象是一个集合,但仍然需要对这些对象的两组不同的引用,一组在正向映射中维护,另一组在反向映射中维护?BiMap的本质是什么?与客户维护太多单独的地图并进行相应更新的替代方法相比,BiMap的本质是什么

  private V putInBothMaps(K key, V value, boolean force) {
    boolean containedKey = containsKey(key);
    if (containedKey && Objects.equal(value, get(key))) {
      return value;
    }
    if (force) {
      inverse().remove(value);
    } else if (containsValue(value)) {
      throw new IllegalArgumentException(
          "value already present: " + value);
    }
    V oldValue = super.put(key, value);
    updateInverseMap(key, containedKey, oldValue, value);
    return oldValue;
  }

您在哪里看到这样一种说法,即
BiMap
只保留一份数据副本,从而节省了空间
BiMap
仅提供一组条目的正向和反向视图,这两种视图在数据更改时保持一致。节省的成本在于不必手动管理两个映射,并确保在您自己的代码中更新这两个映射(加上错误检查,以防在其中一个映射中添加重复值,从而导致状态不一致)。。。只需使用
BiMap
,让所有这些都为您处理


这不是为了节省空间,而是为了保持代码的简单、可读性和正确性。

(当然,未来的实现可能确实会节省空间;我现在正在自己做一些实验。这是使用库而不是滚动自己的实现的另一个优势:改进是免费的。),也许我应该在维基上添加一个讨论,讨论一下
BiMap
是如何取代这个习惯用法的,因为我现在并没有给出太多细节……当有两个BiMap和两个backing map时,声称两者“由相同的数据支持”至少有点误导。我们或许应该重新措辞。我想是吧?我的意思是,这也是一个特定于实现的东西,将来可能会发生很大的变化。@LouisWasserman,超级旧线程,我知道,但仍然是这样,BiMap没有特定的内存优化来在两个映射中存储数据吗?