Je suis toujours assez perplexe devant le BiMap dans Google collections/Guava. Il a été affirmé que Les deux bimaps sont sauvegardés par les mêmes données; tout changement sur l'un apparaîtra dans l'autre.
J'ai parcouru le code source, et j'ai trouvé l'utilisation du délégué dans ForwardingMap
. Mais dans toute sous-classe de StandardBiMap
, je vois que les données sont mises à la fois dans la map avant et arrière. Alors, quelle est l'essence, et pourquoi prétend-t-il avoir économisé de l'espace en ne conservant qu'une seule copie des données? Est-ce juste que les objets réels sont un ensemble, mais que deux ensembles distincts de références à ces objets sont toujours nécessaires, un ensemble maintenu dans la map avant, et l'autre dans la map arrière? Quelle est l'essence du BiMap ici, par rapport à l'approche alternative où le client maintient simplement deux maps séparées et effectue les mises à jour en conséquence?
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;
}