Предполагая, что слово «эффективный» является ключевой частью вашего вопроса, и в зависимости от того, что вы хотите сделать с набором, может быть идея создать собственный подкласс HashSet, который игнорирует реализацию HashSet и представляет представление вместо этого на существующую карту.
В качестве частично реализованного примера это может выглядеть примерно так:
public class MapBackedHashSet extends HashSet
{
private HashMap theMap;
public MapBackedHashSet(HashMap theMap)
{
this.theMap = theMap;
}
@Override
public boolean contains(Object o)
{
return theMap.containsKey(o);
}
/* etc... */
}
Если вы не знаете, как будет использоваться класс, вам нужно позаботиться о том, чтобы переопределить все соответствующие методы.