Ничего не встроено, поэтому вы либо используете сторонний пакет, например BiMap от Guava, упомянутый Pangea, либо, если вы хотите свернуть свой собственный, если вам нужны два разных типа данных, идея с 2-мя картами неплоха, есливаши ключи и значения имеют тот же тип, что вы можете использовать одну карту с двойными записями:
public class BiMap<T>{
private Map<T,T> theMap = new HashMap<T,T>();
public void put( T key, T value ){ put( key, value, false ); }
public void forcePut( T key, T value ){ put( key, value, true ); }
private void put( T key, T value, boolean force ){
if( force || !theMap.containsKey(value) ){
theMap.remove( theMap.remove( key ) );
theMap.put( key, value );
theMap.put( value, key );
}else if( !theMap.get( value ).equals( key ) ){
// If you allow null values&keys this will get more complicated.
throw new IllegalArgumentException();
// can make this more informative.
}
// else the pair is already in, there's nothing to do.
}
public T get( T key ){ return theMap.get( key ); }
public T remove( T key ){
T value = theMap.remove( key );
if( value != null ) theMap.remove( value );
return value;
}
}
Обратите внимание, что, поскольку все является объектом, с точки зрения эффективности / пространства не так много отходов:единственное, что вы храните дважды, это адреса объектов.То же самое относится и к вашей идее с двумя картами.
Кроме того, не составит труда добавить необходимые методы, чтобы реализовать интерфейс Map<T,T>
для обеспечения соответствия.