如果我将相同的键多次传递给HashMap的put方法,原始值会发生什么变化?如果值重复呢?我没找到任何关于这个的文件。
情况1:键的覆盖值
Map mymap = new HashMap();
mymap.put("1","one");
mymap.put("1","not one");
mymap.put("1","surely not one");
System.out.println(mymap.get("1"));
我们得到的肯定不是1。
案例2:重复值
Map mymap = new HashMap();
mymap.put("1","one");
mymap.put("1","not one");
mymap.put("1","surely not one");
// The following line was added:
mymap.put("1","one");
System.out.println(mymap.get("1"));
我们得到一个。
但是其他的值会怎样呢?我在给一个学生教授基础知识,有人问我这个问题。Map是否像一个引用最后一个值的桶(但在内存中)?
JDK中的映射并不用于在重复的键下存储数据。
在最好的情况下,新值将覆盖之前的值。
更糟糕的情况是异常(例如,当你试图收集它作为一个流):
没有重复:
Stream.of(“一”).collect(收藏者。toMap(x -> x, x -> x))
好的。你将得到:$2 ==> {one=one}
复制流:
流。“一个”,“不是一个”,“肯定不是一个”。toMap(x -> 1, x -> x))
Exception java.lang.IllegalStateException: Duplicate key 1 (attempted merging values one and not one)
| at Collectors.duplicateKeyException (Collectors.java:133)
| at Collectors.lambda$uniqKeysMapAccumulator$1 (Collectors.java:180)
| at ReduceOps$3ReducingSink.accept (ReduceOps.java:169)
| at Spliterators$ArraySpliterator.forEachRemaining (Spliterators.java:948)
| at AbstractPipeline.copyInto (AbstractPipeline.java:484)
| at AbstractPipeline.wrapAndCopyInto (AbstractPipeline.java:474)
| at ReduceOps$ReduceOp.evaluateSequential (ReduceOps.java:913)
| at AbstractPipeline.evaluate (AbstractPipeline.java:234)
| at ReferencePipeline.collect (ReferencePipeline.java:578)
| at (#4:1)
要处理重复的密钥-使用其他包,例如:
https://google.github.io/guava/releases/19.0/api/docs/com/google/common/collect/Multimap.html
有很多其他的实现处理重复的键。
这些是web所需要的(例如,重复的cookie密钥,Http报头可以有相同的字段,…)
好运!:)
它是键/值特性,你不能有多个值的重复键,因为当你想获得实际值时,哪个值属于输入的键在你的例子中,当你想获得值“1”时,它是哪一个?!这就是为什么每个值都有唯一的键,但你可以通过Java标准库有一个技巧:
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
public class DuplicateMap<K, V> {
private Map<K, ArrayList<V>> m = new HashMap<>();
public void put(K k, V v) {
if (m.containsKey(k)) {
m.get(k).add(v);
} else {
ArrayList<V> arr = new ArrayList<>();
arr.add(v);
m.put(k, arr);
}
}
public ArrayList<V> get(K k) {
return m.get(k);
}
public V get(K k, int index) {
return m.get(k).size()-1 < index ? null : m.get(k).get(index);
}
}
你可以这样使用它:
public static void main(String[] args) {
DuplicateMap<String,String> dm=new DuplicateMap<>();
dm.put("1", "one");
dm.put("1", "not one");
dm.put("1", "surely not one");
System.out.println(dm.get("1"));
System.out.println(dm.get("1",1));
System.out.println(dm.get("1", 5));
}
打印结果为:
[one, not one, surely not one]
not one
null
我总是用:
HashMap<String, ArrayList<String>> hashy = new HashMap<String, ArrayList<String>>();
如果我想把多个东西应用到一个标识键上。
public void MultiHash(){
HashMap<String, ArrayList<String>> hashy = new HashMap<String, ArrayList<String>>();
String key = "Your key";
ArrayList<String> yourarraylist = hashy.get(key);
for(String valuessaved2key : yourarraylist){
System.out.println(valuessaved2key);
}
}
你可以做一些这样的事情,为自己创建一个迷宫!
public void LOOK_AT_ALL_THESE_HASHMAPS(){
HashMap<String, HashMap<String, HashMap<String, HashMap<String, String>>>> theultimatehashmap = new HashMap <String, HashMap<String, HashMap<String, HashMap<String, String>>>>();
String ballsdeep_into_the_hashmap = theultimatehashmap.get("firststring").get("secondstring").get("thirdstring").get("forthstring");
}
JDK中的映射并不用于在重复的键下存储数据。
在最好的情况下,新值将覆盖之前的值。
更糟糕的情况是异常(例如,当你试图收集它作为一个流):
没有重复:
Stream.of(“一”).collect(收藏者。toMap(x -> x, x -> x))
好的。你将得到:$2 ==> {one=one}
复制流:
流。“一个”,“不是一个”,“肯定不是一个”。toMap(x -> 1, x -> x))
Exception java.lang.IllegalStateException: Duplicate key 1 (attempted merging values one and not one)
| at Collectors.duplicateKeyException (Collectors.java:133)
| at Collectors.lambda$uniqKeysMapAccumulator$1 (Collectors.java:180)
| at ReduceOps$3ReducingSink.accept (ReduceOps.java:169)
| at Spliterators$ArraySpliterator.forEachRemaining (Spliterators.java:948)
| at AbstractPipeline.copyInto (AbstractPipeline.java:484)
| at AbstractPipeline.wrapAndCopyInto (AbstractPipeline.java:474)
| at ReduceOps$ReduceOp.evaluateSequential (ReduceOps.java:913)
| at AbstractPipeline.evaluate (AbstractPipeline.java:234)
| at ReferencePipeline.collect (ReferencePipeline.java:578)
| at (#4:1)
要处理重复的密钥-使用其他包,例如:
https://google.github.io/guava/releases/19.0/api/docs/com/google/common/collect/Multimap.html
有很多其他的实现处理重复的键。
这些是web所需要的(例如,重复的cookie密钥,Http报头可以有相同的字段,…)
好运!:)
该键的先前值将被删除并替换为新值。
如果你想保留一个键给定的所有值,你可以考虑实现这样的东西:
import org.apache.commons.collections.MultiHashMap;
import java.util.Set;
import java.util.Map;
import java.util.Iterator;
import java.util.List;
public class MultiMapExample {
public static void main(String[] args) {
MultiHashMap mp=new MultiHashMap();
mp.put("a", 10);
mp.put("a", 11);
mp.put("a", 12);
mp.put("b", 13);
mp.put("c", 14);
mp.put("e", 15);
List list = null;
Set set = mp.entrySet();
Iterator i = set.iterator();
while(i.hasNext()) {
Map.Entry me = (Map.Entry)i.next();
list=(List)mp.get(me.getKey());
for(int j=0;j<list.size();j++)
{
System.out.println(me.getKey()+": value :"+list.get(j));
}
}
}
}