我仍然对BiMap中的Google collections/Guava感到困惑。据称这两个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;
}
答案 0 :(得分:8)
通过仅保留一份数据副本,您认为BiMap
在哪里声称BiMap
可以节省空间? BiMap
只提供一组条目的正向和反向视图,这些条目在数据更改时保持一致。节省的是不必手动管理两个映射,并确保在您自己的代码中更新两个映射(加上错误检查,以便将重复值添加到其中一个映射,导致状态不一致)...只需使用{{1}}让所有这些都为你处理。
这不是为了节省空间,而是为了保持代码简单,可读和正确。