输入重复键时保持原始 key/value 的哈希图

Hashmap that keeps original key/value when duplicate key entered

当输入重复的密钥时,Hashmap 是否可以保留其原始的 key/value 对?

例如,假设我有这样的东西:

Map<String, String> map = new HashMap<String, String>();

map.put("username","password1");
map.put("username","password2");

我希望保留原始 key/value 对 - 用户名、密码 1,而不是被用户名、密码 2 覆盖。

这可能吗?如果没有,我怎样才能消除重复的条目被放入地图?

https://docs.oracle.com/javase/8/docs/api/java/util/HashMap.html#putIfAbsent-K-V-

如果你使用的是Java8,你可以使用putIfAbsent。

如前所述,如果您使用 Java 8.

,则可以使用 putIfAbsent

如果您使用的是较旧的 Java 版本,您可以使用 ConcurrentHashMap,它有一个 putIfAbsent 方法。

当然,您会得到线程安全的额外开销,但如果您不是在编写对性能极其敏感的应用程序,则不必担心。

如果不在 Java 8 上,您有一些选择。

最直接的就是到处都是冗长的代码

Object existingValue = map.get(key);
if(existingValue == null){
    map.put(key,newValue);
}

你可以有一个实用方法来为你做这件事

public <T,V> void addToMapIfAbsent(Map<T,V> map, T key, V value){
    V oldValue = map.get(key);
    if(oldValue == null){
       map.put(key,value);
    }
}

或者扩展 Map 的风格并将其添加到那里。

public class MyMap<T,V> extends HashMap<T,V>{
    public void putIfNotExist(T key, V value){
        V oldValue = get(key);
        if(oldValue == null){
            put(key,value);
        }
    }
}

这样就可以创建Map

Map<String,String> map = new MyMap<>();

编辑:当然,要使用 MyMap 方法,您需要将 map 变量声明为该类型。所以在任何你需要的地方,你都必须使用 MyMap 的实例而不是 Map.