【问题标题】:Essence of BiMap in Google collectionsGoogle 收藏中 BiMap 的精髓
【发布时间】:2012-05-31 16:36:56
【问题描述】:

我对@9​​87654322@中的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;
  }

【问题讨论】:

    标签: java data-structures guava


    【解决方案1】:

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

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

    【讨论】:

    • (虽然可以肯定的是,未来的实现确实可能会节省空间;我现在正在自己做一些实验。这是使用库而不是滚动自己的实现的另一个优点:改进来了免费。)
    • 关于那个注释,也许我应该在维基上添加一个关于BiMap 是如何取代这个成语的讨论,因为我目前并没有提供太多细节......
    • 当有两个 BiMap 和两个支持 Map 时,声称两者“由相同的数据支持”至少是一种误导。我们可能应该重新措辞。 docs.guava-libraries.googlecode.com/git/javadoc/com/google/…
    • 我猜?我的意思是,这也是一个特定于实现的事情,将来很可能会发生变化。
    • @LouisWasserman,超级老线程,我知道,但情况仍然如此,BiMap 没有特定的内存优化来在两个地图中存储数据?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-12
    • 1970-01-01
    • 2016-07-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多