输入重复键时保持原始键/值的Hashmap

时间:2015-05-21 20:10:00

标签: java hashmap key-value duplicates

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

例如,让我说我有这样的事情:

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

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

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

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

3 个答案:

答案 0 :(得分:5)

如上所述,如果使用Java 8,则可以使用putIfAbsent

如果您使用较旧的Java版本,则可以使用ConcurrentHashMap代替putIfAbsent方法。

当然,您获得了线程安全的额外开销,但如果您没有编写性能极其敏感的应用程序,则不应该关注它。

答案 1 :(得分:2)

如果没有在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的实例。

答案 2 :(得分:0)

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

如果您使用的是Java 8,则可以使用putIfAbsent。