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

boo*_*eye 260 java hashtable 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"));
Run Code Online (Sandbox Code Playgroud)

我们得到了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"));
Run Code Online (Sandbox Code Playgroud)

我们得到了one.

但是其他价值观会发生什么?我正在向学生教授基础知识,我被问到这个问题.是Map一个桶,其中引用了最后一个值(但在内存中)?

jhe*_*ngs 296

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

地图只是删除了对值的引用.如果没有其他任何东西持有对该对象的引用,该对象就有资格进行垃圾回收.此外,Java返回与给定键关联的任何先前值(null如果不存在),因此您可以确定存在的值并在必要时维护引用.

更多信息:HashMap Doc


Pas*_*ent 75

您可以在Map#put(K,V)的javadoc中找到答案(实际上返回了一些内容):

public V put(K key,
             V value)
Run Code Online (Sandbox Code Playgroud)

将指定的值与此映射中的指定键相关联(可选操作).如果映射先前包含此键的映射,则旧值将替换为指定的值.(当且仅当将返回时,地图m被称为包含密钥的映射.)km.containsKey(k)true

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

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

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

  • *返回值*是*之前的值*(或`null`),如上面javadoc中所述,是的,这就是我的意思.真的会被误解吗? (3认同)

Bis*_*wal 21

替换相应键的映射中的现有值。如果不存在具有相同名称的键,则它会创建一个具有提供值的键。例如:

Map mymap = new HashMap();
mymap.put("1","one");
mymap.put("1","two");
Run Code Online (Sandbox Code Playgroud)

输出 键 =“1”,值 =“二”

因此,先前的值被覆盖。


kam*_*606 18

键的先前值将被删除并替换为新值.

如果您希望保留所有值,则可以考虑实现以下内容:

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));
         }
      }
   }
}
Run Code Online (Sandbox Code Playgroud)


jav*_*acm 17

它是键/值功能,您不能为多个值设置重复键,因为当您想
获得值为"1"时,如果您希望获得值为"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);
    }
}
Run Code Online (Sandbox Code Playgroud)


你可以用这种方式使用它:

    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));
}
Run Code Online (Sandbox Code Playgroud)

打印结果如下:

[one, not one, surely not one]
not one
null
Run Code Online (Sandbox Code Playgroud)


Die*_*vis 12

将指定的值与此映射中的指定键相关联.如果映射先前包含键的映射,则替换旧值.