Google收藏中BiMap的精髓

2 java guava data-structures

我仍然在挺纳闷BIMAP谷歌的集合/番石榴.有人声称这两个bimaps有相同的数据支持; 对一个的任何更改都将出现在另一个中.

我浏览了源代码,然后发现了委托的使用ForwardingMap.但是在任何实际的子类中StandardBiMap,我确实看到数据被放入前向和反向映射中.那么它的本质是什么,以及它为什么声称通过只保留一份数据来节省空间呢?它只是实际的对象是一个集合,但是仍然需要对这些对象的两个不同的引用集,一个集合在前向映射中维护,另一个集合在反向映射中?这里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;
  }
Run Code Online (Sandbox Code Playgroud)

Col*_*inD 8

您在哪里看到BiMap通过仅保留一份数据来节省空间的声明?BiMap只提供一组条目的前向和反向视图,这些条目在数据更改时保持一致.节省的是不必手动管理两个映射,并确保在您自己的代码中更新两个映射(加上错误检查,以便将重复值添加到其中一个映射,导致状态不一致)...只需使用BiMap让所有这一切都为你处理.

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

  • (虽然可以肯定的是,未来的实现可能确实可以节省空间;我现在正在做一些自己的实验.这是使用库而不是滚动自己的实现的另一个好处:改进是免费的.) (5认同)
  • 当有两个BiMaps和两个支持地图时,声称两者"由相同数据支持"的说法至少有点误导.我们可能应该改写一下.http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/collect/BiMap.html#inverse%28%29 (3认同)