【发布时间】:2012-05-31 16:36:56
【问题描述】:
我对@987654322@中的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