001/* 002 * Copyright (C) 2007 The Guava Authors 003 * 004 * Licensed under the Apache License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.apache.org/licenses/LICENSE-2.0 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013 * See the License for the specific language governing permissions and 014 * limitations under the License. 015 */ 016 017package com.google.common.collect; 018 019import com.google.common.annotations.GwtCompatible; 020import com.google.errorprone.annotations.CanIgnoreReturnValue; 021import java.util.Map; 022import java.util.Set; 023import org.jspecify.annotations.Nullable; 024 025/** 026 * A bimap (or "bidirectional map") is a map that preserves the uniqueness of its values as well as 027 * that of its keys. This constraint enables bimaps to support an "inverse view", which is another 028 * bimap containing the same entries as this bimap but with reversed keys and values. 029 * 030 * <h3>Implementations</h3> 031 * 032 * <ul> 033 * <li>{@link ImmutableBiMap} 034 * <li>{@link HashBiMap} 035 * <li>{@link EnumBiMap} 036 * <li>{@link EnumHashBiMap} 037 * </ul> 038 * 039 * <p>See the Guava User Guide article on <a href= 040 * "https://github.com/google/guava/wiki/NewCollectionTypesExplained#bimap">{@code BiMap}</a>. 041 * 042 * @author Kevin Bourrillion 043 * @since 2.0 044 */ 045@GwtCompatible 046public interface BiMap<K extends @Nullable Object, V extends @Nullable Object> extends Map<K, V> { 047 // Modification Operations 048 049 /** 050 * {@inheritDoc} 051 * 052 * @throws IllegalArgumentException if the given value is already bound to a different key in this 053 * bimap. The bimap will remain unmodified in this event. To avoid this exception, call {@link 054 * #forcePut} instead. 055 */ 056 @CanIgnoreReturnValue 057 @Override 058 @Nullable V put(@ParametricNullness K key, @ParametricNullness V value); 059 060 /** 061 * An alternate form of {@code put} that silently removes any existing entry with the value {@code 062 * value} before proceeding with the {@link #put} operation. If the bimap previously contained the 063 * provided key-value mapping, this method has no effect. 064 * 065 * <p>Note that a successful call to this method could cause the size of the bimap to increase by 066 * one, stay the same, or even decrease by one. 067 * 068 * <p><b>Warning:</b> If an existing entry with this value is removed, the key for that entry is 069 * discarded and not returned. 070 * 071 * @param key the key with which the specified value is to be associated 072 * @param value the value to be associated with the specified key 073 * @return the value that was previously associated with the key, or {@code null} if there was no 074 * previous entry. (If the bimap contains null values, then {@code forcePut}, like {@code 075 * put}, returns {@code null} both if the key is absent and if it is present with a null 076 * value.) 077 */ 078 @CanIgnoreReturnValue 079 @Nullable V forcePut(@ParametricNullness K key, @ParametricNullness V value); 080 081 // Bulk Operations 082 083 /** 084 * {@inheritDoc} 085 * 086 * <p><b>Warning:</b> the results of calling this method may vary depending on the iteration order 087 * of {@code map}. 088 * 089 * @throws IllegalArgumentException if an attempt to {@code put} any entry fails. Note that some 090 * map entries may have been added to the bimap before the exception was thrown. 091 */ 092 @Override 093 void putAll(Map<? extends K, ? extends V> map); 094 095 // Views 096 097 /** 098 * {@inheritDoc} 099 * 100 * <p>Because a bimap has unique values, this method returns a {@link Set}, instead of the {@link 101 * java.util.Collection} specified in the {@link Map} interface. 102 */ 103 @Override 104 Set<V> values(); 105 106 /** 107 * Returns the inverse view of this bimap, which maps each of this bimap's values to its 108 * associated key. The two bimaps are backed by the same data; any changes to one will appear in 109 * the other. 110 * 111 * <p><b>Note:</b>There is no guaranteed correspondence between the iteration order of a bimap and 112 * that of its inverse. 113 * 114 * @return the inverse view of this bimap 115 */ 116 BiMap<V, K> inverse(); 117}