将重复密钥放入HashMap时会发生什么?

如果我多次将相同的密钥传递给HashMapput方法,原始值会发生什么变化? 而且,如果价值重复呢? 我没有找到任何关于此的文档。

情况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"));

我们surely not one

情况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"));

我们得到one

但其他值会发生什么? 我正在向一名学生教授基础知识,并被问到这一点。 Map是否像引用最后一个值的存储桶(但在内存中)?


根据定义, put命令将替换与映射中给定键相关联的先前值(概念上类似于原始类型的数组索引操作)。

地图只是简单地将其引用值删除。 如果没有其他东西持有对该对象的引用,那么该对象就有资格进行垃圾回收。 此外,Java会返回与给定键相关的任何以前的值(如果不存在,则返回null ),因此您可以确定有哪些值并在必要时保留引用。

更多信息在这里:HashMap Doc


你可以在Map#put(K,V)的javadoc中找到你的答案(实际上它会返回一些东西):

public V put(K key,
             V value)

将指定的值与此映射中指定的键关联(可选操作)。 如果映射先前包含此键的映射,则旧值将被指定值替换。 (当且仅当m.containsKey(k)将返回true映射m才被认为包含关键k的映射。)

参数:
key - 与指定值关联的键。
value - 与指定键相关联的值。

返回:
以前的值与指定的键相关联;如果没有key映射,则返回null 。 (如果实现支持null值,则null返回也可以指示映射先前将null与指定key相关联。)

因此,如果在调用mymap.put("1", "a string")时不指定返回的值,则它将变为未引用并因此有资格进行垃圾回收。


密钥的先前值将被删除并替换为新密钥。

如果你想保留一个关键字的所有值,你可以考虑执行这样的事情:

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));
         }
      }
   }
}
链接地址: http://www.djcxy.com/p/20113.html

上一篇: What happens when a duplicate key is put into a HashMap?

下一篇: Json.NET deserialise to interface implementation