Java 是否可以创建一个地图,其中每个关键点指向相同的值?

Java 是否可以创建一个地图,其中每个关键点指向相同的值?,java,hashtable,Java,Hashtable,(在Java中)是否可以创建一个映射,在该映射中,无论我要搜索哪个键,我都会检索相同的值?我们可以假设键的数量是有限的,也可以是无限的 我考虑了大小为1、加载因子为1.0的映射,其中存储了该值,但我几乎肯定hashmap实现将识别冲突,并返回null 我还考虑了这样一种可能性:如果我为一个变量创建了自己的hashfunction,或者甚至为实现Map的新数据类型创建了hashfunction,那么我应该能够做到这一点,但这可能有点混乱。也许不是 当然,简单地将值映射到每个键将是非常低效的(除非有

(在Java中)是否可以创建一个映射,在该映射中,无论我要搜索哪个键,我都会检索相同的值?我们可以假设键的数量是有限的,也可以是无限的

我考虑了大小为1、加载因子为1.0的映射,其中存储了该值,但我几乎肯定hashmap实现将识别冲突,并返回null

我还考虑了这样一种可能性:如果我为一个变量创建了自己的hashfunction,或者甚至为实现Map的新数据类型创建了hashfunction,那么我应该能够做到这一点,但这可能有点混乱。也许不是


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

我不太确定您在这里想要完成什么,但您需要做的就是实现。例如:

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;
    }

}
import java.util.Collection;
导入java.util.Map;
导入java.util.Set;
公共类ImmutableMap实现了映射{
私有最终V不可变值;
公共不可变映射(最终V不可变值){
this.immutableValue=immutableValue;
}
@凌驾
公共整数大小(){
返回0;
}
@凌驾
公共布尔值为空(){
返回false;
}
@凌驾
公共布尔containsKey(对象键){
返回false;
}
@凌驾
公共布尔包含值(对象值){
如果(值==不可变值)
返回true;
返回false;
}
@凌驾
public V get(对象键){
返回不可变值;
}
@凌驾
公共V输入(K键,V值){
抛出新的UnsupportedOperationException();
}
@凌驾
公共V删除(对象密钥){
抛出新的UnsupportedOperationException();
}
@凌驾

public void putAll(Map我认为使用现有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);

因此,您可能会记住这一点,例如,如果您计划检查
入口集

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

  • 您可以使用apachecommons实现

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

  • 您始终可以实现自己的


  • 是的,这正是我所考虑的。这似乎是一个不太理想的情况,因为它创建了一个只能使用一次的类。你应该实现Map而不是HashMap,并正确地实现所有方法。我无法理解
    immutableValue
    没有映射到任何键,
    put
    函数是no不可用。因此它类似于普通的
    dto
    ,可以保存相同的数据,而不扩展到HashMap。如果我的理解有任何地方出错,请纠正我。创造性的回答!我没有想到比较器,因为我以前从未在实践中使用过比较器。我会尝试一下,谢谢。使用自定义比较器的TreeMap可以做到这一点有很多有趣的东西。
    m.put("abc", "123");
    m.put("def", "456");
    // prints something like {abc=456}
    System.out.println(m);