当输入重复键时,Hashmap
是否可以保留原始key/value
对?
例如,让我说我有这样的事情:
Map<String, String> map = new HashMap<String, String>();
map.put("username","password1");
map.put("username","password2");
我希望原始的key/value
对 - 用户名,密码1保留,不要被用户名,密码2覆盖。
这可能吗?如果没有,我如何消除重复的条目被放入地图?
答案 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。