2

我仍然对 Google collections/Guava 中的BiMap感到困惑。据称这两个 bimap 由相同的数据支持;对其中一个的任何更改都会出现在另一个中。

我浏览了源代码,发现在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;
  }
4

1 回答 1

8

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

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

于 2012-05-31T16:48:15.820 回答