如果我将相同的键多次传递给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是否像一个引用最后一个值的桶(但在内存中)?


当前回答

对于你的问题,地图是否像一个桶:不是。

它就像一个带有name=value对的列表,而name不需要是字符串(尽管它可以)。

要获取一个元素,您将键传递给get()方法,该方法返回给您赋值的对象。

Hashmap意味着如果您试图使用get方法检索对象,它不会将实际对象与您提供的对象进行比较,因为它需要遍历其列表并将您提供的键与当前元素进行比较()。

这将是低效的。相反,不管你的对象由什么组成,它都会从两个对象中计算一个所谓的hashcode并进行比较。比较两个int型对象要比比较两个完整的(可能非常复杂)对象容易得多。您可以将hashcode想象成具有预定义长度(int)的摘要,因此它不是唯一的,并且具有冲突。您可以在我插入链接的文档中找到hashcode的规则。

如果你想了解更多,你可能想看看javapractices.com和technofundo.com上的文章

问候

其他回答

我总是用:

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");
}

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

如果你想保留一个键给定的所有值,你可以考虑实现这样的东西:

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));
         }
      }
   }
}

它替换对应键的映射中现有的值。如果不存在同名的键,则使用所提供的值创建一个键。 例如:

Map mymap = new HashMap();
mymap.put("1","one");
mymap.put("1","two");

输出 Key = "1", value = " 2 "

所以,之前的值会被覆盖。

对于你的问题,地图是否像一个桶:不是。

它就像一个带有name=value对的列表,而name不需要是字符串(尽管它可以)。

要获取一个元素,您将键传递给get()方法,该方法返回给您赋值的对象。

Hashmap意味着如果您试图使用get方法检索对象,它不会将实际对象与您提供的对象进行比较,因为它需要遍历其列表并将您提供的键与当前元素进行比较()。

这将是低效的。相反,不管你的对象由什么组成,它都会从两个对象中计算一个所谓的hashcode并进行比较。比较两个int型对象要比比较两个完整的(可能非常复杂)对象容易得多。您可以将hashcode想象成具有预定义长度(int)的摘要,因此它不是唯一的,并且具有冲突。您可以在我插入链接的文档中找到hashcode的规则。

如果你想了解更多,你可能想看看javapractices.com和technofundo.com上的文章

问候

顺便说一下,如果你想要一些语义,比如只有当这个键不存在时才放。你可以使用concurrentHashMap与putIfAbsent()函数。 看看这个:

https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ConcurrentHashMap.html将(K, % 20 v)

concurrentHashMap是线程安全的高性能,因为它使用“锁条带”机制来提高吞吐量。