public final class HashBiMap<K,V> extends Maps.IteratorBasedAbstractMap<K,V> implements BiMap<K,V>, java.io.Serializable
BiMap
backed by two hash tables. This implementation allows null keys and values. A
HashBiMap
and its inverse are both serializable.
This implementation guarantees insertion-based iteration order of its keys.
See the Guava User Guide article on BiMap
.
Modifier and Type | Class and Description |
---|---|
private static class |
HashBiMap.BiEntry<K,V> |
private class |
HashBiMap.Inverse |
private static class |
HashBiMap.InverseSerializedForm<K,V> |
(package private) class |
HashBiMap.Itr<T> |
private class |
HashBiMap.KeySet |
Modifier and Type | Field and Description |
---|---|
private HashBiMap.BiEntry<K,V> |
firstInKeyInsertionOrder |
private HashBiMap.BiEntry<K,V>[] |
hashTableKToV |
private HashBiMap.BiEntry<K,V>[] |
hashTableVToK |
private BiMap<V,K> |
inverse |
private HashBiMap.BiEntry<K,V> |
lastInKeyInsertionOrder |
private static double |
LOAD_FACTOR |
private int |
mask |
private int |
modCount |
private static long |
serialVersionUID |
private int |
size |
Modifier | Constructor and Description |
---|---|
private |
HashBiMap(int expectedSize) |
Modifier and Type | Method and Description |
---|---|
void |
clear() |
boolean |
containsKey(java.lang.Object key) |
boolean |
containsValue(java.lang.Object value)
Returns
true if this BiMap contains an entry whose value is equal to value (or,
equivalently, if this inverse view contains a key that is equal to value ). |
static <K,V> HashBiMap<K,V> |
create()
Returns a new, empty
HashBiMap with the default initial capacity (16). |
static <K,V> HashBiMap<K,V> |
create(int expectedSize)
Constructs a new, empty bimap with the specified expected size.
|
static <K,V> HashBiMap<K,V> |
create(java.util.Map<? extends K,? extends V> map)
Constructs a new bimap containing initial values from
map . |
private HashBiMap.BiEntry<K,V>[] |
createTable(int length) |
private void |
delete(HashBiMap.BiEntry<K,V> entry)
Finds and removes
entry from the bucket linked lists in both the key-to-value direction
and the value-to-key direction. |
(package private) java.util.Iterator<java.util.Map.Entry<K,V>> |
entryIterator() |
V |
forcePut(K key,
V value)
An alternate form of
put that silently removes any existing entry with the value value before proceeding with the BiMap.put(K, V) operation. |
void |
forEach(java.util.function.BiConsumer<? super K,? super V> action) |
V |
get(java.lang.Object key) |
private void |
init(int expectedSize) |
private void |
insert(HashBiMap.BiEntry<K,V> entry,
HashBiMap.BiEntry<K,V> oldEntryForKey) |
BiMap<V,K> |
inverse()
Returns the inverse view of this bimap, which maps each of this bimap's values to its
associated key.
|
java.util.Set<K> |
keySet() |
V |
put(K key,
V value) |
private V |
put(K key,
V value,
boolean force) |
private K |
putInverse(V value,
K key,
boolean force) |
private void |
readObject(java.io.ObjectInputStream stream) |
private void |
rehashIfNecessary() |
V |
remove(java.lang.Object key) |
void |
replaceAll(java.util.function.BiFunction<? super K,? super V,? extends V> function) |
private HashBiMap.BiEntry<K,V> |
seekByKey(java.lang.Object key,
int keyHash) |
private HashBiMap.BiEntry<K,V> |
seekByValue(java.lang.Object value,
int valueHash) |
int |
size() |
java.util.Set<V> |
values() |
private void |
writeObject(java.io.ObjectOutputStream stream) |
entrySet, entrySpliterator, forEachEntry
clone, equals, hashCode, isEmpty, putAll, toString
private static final double LOAD_FACTOR
private transient HashBiMap.BiEntry<K,V>[] hashTableKToV
private transient HashBiMap.BiEntry<K,V>[] hashTableVToK
@CheckForNull private transient HashBiMap.BiEntry<K,V> firstInKeyInsertionOrder
@CheckForNull private transient HashBiMap.BiEntry<K,V> lastInKeyInsertionOrder
private transient int size
private transient int mask
private transient int modCount
private static final long serialVersionUID
public static <K,V> HashBiMap<K,V> create()
HashBiMap
with the default initial capacity (16).public static <K,V> HashBiMap<K,V> create(int expectedSize)
expectedSize
- the expected number of entriesjava.lang.IllegalArgumentException
- if the specified expected size is negativepublic static <K,V> HashBiMap<K,V> create(java.util.Map<? extends K,? extends V> map)
map
. The bimap is created with an
initial capacity sufficient to hold the mappings in the specified map.private void init(int expectedSize)
private void delete(HashBiMap.BiEntry<K,V> entry)
entry
from the bucket linked lists in both the key-to-value direction
and the value-to-key direction.private void insert(HashBiMap.BiEntry<K,V> entry, @CheckForNull HashBiMap.BiEntry<K,V> oldEntryForKey)
@CheckForNull private HashBiMap.BiEntry<K,V> seekByKey(@CheckForNull java.lang.Object key, int keyHash)
@CheckForNull private HashBiMap.BiEntry<K,V> seekByValue(@CheckForNull java.lang.Object value, int valueHash)
public boolean containsKey(@CheckForNull java.lang.Object key)
public boolean containsValue(@CheckForNull java.lang.Object value)
true
if this BiMap contains an entry whose value is equal to value
(or,
equivalently, if this inverse view contains a key that is equal to value
).
Due to the property that values in a BiMap are unique, this will tend to execute in faster-than-linear time.
@CheckForNull public V get(@CheckForNull java.lang.Object key)
@CheckForNull public V forcePut(K key, V value)
BiMap
put
that silently removes any existing entry with the value value
before proceeding with the BiMap.put(K, V)
operation. If the bimap previously contained the
provided key-value mapping, this method has no effect.
Note that a successful call to this method could cause the size of the bimap to increase by one, stay the same, or even decrease by one.
Warning: If an existing entry with this value is removed, the key for that entry is discarded and not returned.
forcePut
in interface BiMap<K,V>
key
- the key with which the specified value is to be associatedvalue
- the value to be associated with the specified keynull
if there was no
previous entry. (If the bimap contains null values, then forcePut
, like put
, returns null
both if the key is absent and if it is present with a null
value.)private void rehashIfNecessary()
private HashBiMap.BiEntry<K,V>[] createTable(int length)
@CheckForNull public V remove(@CheckForNull java.lang.Object key)
public void clear()
public int size()
public java.util.Set<K> keySet()
public java.util.Set<V> values()
BiMap
Because a bimap has unique values, this method returns a Set
, instead of the Collection
specified in the Map
interface.
java.util.Iterator<java.util.Map.Entry<K,V>> entryIterator()
entryIterator
in class Maps.IteratorBasedAbstractMap<K,V>
public void replaceAll(java.util.function.BiFunction<? super K,? super V,? extends V> function)
public BiMap<V,K> inverse()
BiMap
Note:There is no guaranteed correspondence between the iteration order of a bimap and that of its inverse.
private void writeObject(java.io.ObjectOutputStream stream) throws java.io.IOException
java.io.IOException
private void readObject(java.io.ObjectInputStream stream) throws java.io.IOException, java.lang.ClassNotFoundException
java.io.IOException
java.lang.ClassNotFoundException