是否可以创建一个Map,其中每个Key指向相同的值?

时间:2015-02-17 04:53:50

标签: java hashtable

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

我考虑了一个大小为1且加载因子为1.0的映射,其中存储了该值,但我几乎肯定了hashmap实现将识别碰撞,并且无论如何都返回null。

我还认识到如果我为变量创建自己的哈希函数,甚至是实现Map的新数据类型,我应该能够做到这一点,但它可能有点混乱。也许不是吗?

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

3 个答案:

答案 0 :(得分:4)

我认为使用现有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

,您可能会记住这一点

答案 1 :(得分:1)

我不太确定你要在这里完成什么,但你需要做的就是实施 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;
    }

}

答案 2 :(得分:0)

我不确定你要完成什么,我猜使用默认值的Map应该适合你。这是非常标准的模式。

  1. 您可以使用apache commons DefaultedMap implementation

  2. 在Java 8中,您可以使用Map.getOrDefault

  3. 您可以随时实施自己的

  4. HashMap to return default value for non-found keys?