【问题标题】:Hashmap that keeps original key/value when duplicate key entered输入重复键时保留原始键/值的哈希图
【发布时间】:2015-08-03 16:38:46
【问题描述】:

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

例如,假设我有这样的事情:

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

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

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

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

【问题讨论】:

标签: java hashmap key-value duplicates


【解决方案1】:

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

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

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

【讨论】:

  • 如果我使用map.containsKey(key) 检查每个条目是否有重复项怎么办?这与使用ConcurrentHashMap 相比如何?
  • @user2456977 如果您对 hashmap 具有单线程访问权限,这也是一个选项(我假设这是一个常规的 HashMap)。但是它需要更多的代码来编写并且可读性较差。
【解决方案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 的实例。

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2014-07-02
      • 2015-05-10
      • 1970-01-01
      • 1970-01-01
      • 2021-11-03
      • 2018-06-18
      • 1970-01-01
      • 1970-01-01
      • 2017-03-17
      相关资源
      最近更新 更多