是否可以创建一个每个键都指向相同值的映射?

Is it possible to create a Map where every Key points to the same Value?

是否可以(在 Java 中)创建一个 Map,无论我要搜索哪个键,我都会检索到相同的值?我们可以假设密钥的数量是有限的或无限的。

我考虑过大小为 1 且加载因子为 1.0 的映射,其中存储了该值,但我几乎肯定 hashmap 实现将识别冲突,并且 return 无论如何都是 null。

我也接受了这样的可能性,如果我为一个变量创建我自己的散列函数,或者甚至是一个实现 Map 的新数据类型,我应该能够做到这一点,但它可能有点混乱。也许不是?

当然,简单地将值映射到每个键是非常低效的(除非有一个内置的方法,我忽略了这一点),而且远没有听到 SO 的答案那么有趣。

我不太确定你在这里想要完成什么,但你需要做的就是实施 Map。一个例子:

import java.util.Collection;
import java.util.Map;
import java.util.Set;

public class ImmutableMap<K, V> implements Map<K, V> {

    private final V immutableValue;

    public ImmutableMap(final V immutableValue) {
        this.immutableValue = immutableValue;
    }

    @Override
    public int size() {
        return 0;
    }

    @Override
    public boolean isEmpty() {
        return false;
    }

    @Override
    public boolean containsKey(Object key) {
        return false;
    }

    @Override
    public boolean containsValue(Object value) {
        if (value == immutableValue)
            return true;
        return false;
    }

    @Override
    public V get(Object key) {
        return immutableValue;
    }

    @Override
    public V put(K key, V value) {
        throw new UnsupportedOperationException();
    }

    @Override
    public V remove(Object key) {
        throw new UnsupportedOperationException();
    }

    @Override
    public void putAll(Map<? extends K, ? extends V> m) {
        throw new UnsupportedOperationException();
    }

    @Override
    public void clear() {
        throw new UnsupportedOperationException();
    }

    /**
     * Below are some unnecessary methods for the purpose of this class.
     * You may decide their action.
     */

    @Override
    public Set<K> keySet() {
        return null;
    }

    @Override
    public Collection<V> values() {
        return null;
    }

    @Override
    public Set<java.util.Map.Entry<K, V>> entrySet() {
        return null;
    }

}

我认为使用现有 API 执行此操作的最合理方法如下:

// Java 6/7
new TreeMap<K, V>(new Comparator<K>() {
    @Override
    public int compare(K lhs, K rhs) {
        return 0;
    }
});

// Java 8+
new TreeMap<K, V>((a, b) -> 0);

TreeMap 认为所有键都相等,但在其他方面会保持很好的 Map 语义。

请注意,您放入地图的第一个键将永远保留在其中,除非您 remove 它。

m.put("abc", "123");
m.put("def", "456");
// prints something like {abc=456}
System.out.println(m);

因此,例如,如果您计划检查 entrySet

,您可能会记住这一点

我不确定您要完成什么,我想具有默认值的 Map 应该适合您。这是非常标准的模式。

  1. 您可以使用 apache commons DefaultedMap 实现

  2. 在Java8中,可以使用Map.getOrDefault

  3. 您始终可以实现自己的

HashMap to return default value for non-found keys?