如果我将相同的键多次传递给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是否像一个引用最后一个值的桶(但在内存中)?
你可以在map# put(K, V)的javadoc中找到答案(它实际上会返回一些东西):
public V put(K key,
V value)
Associates the specified value with the specified key in this map
(optional operation). If the map
previously contained a mapping for
this key, the old value is replaced by
the specified value. (A map m is said
to contain a mapping for a key k if
and only if m.containsKey(k) would
return true.)
Parameters:
key - key with which the specified value is to be associated.
value - value to be associated with the specified key.
Returns:
previous value associated with specified key, or null if there was no
mapping for key. (A null return can also indicate that the map previously associated null with the specified key, if the implementation supports null values.)
如果你在调用mymap时不分配返回值。Put ("1", "a string"),它就变成不被引用的,因此有资格进行垃圾收集。
对于你的问题,地图是否像一个桶:不是。
它就像一个带有name=value对的列表,而name不需要是字符串(尽管它可以)。
要获取一个元素,您将键传递给get()方法,该方法返回给您赋值的对象。
Hashmap意味着如果您试图使用get方法检索对象,它不会将实际对象与您提供的对象进行比较,因为它需要遍历其列表并将您提供的键与当前元素进行比较()。
这将是低效的。相反,不管你的对象由什么组成,它都会从两个对象中计算一个所谓的hashcode并进行比较。比较两个int型对象要比比较两个完整的(可能非常复杂)对象容易得多。您可以将hashcode想象成具有预定义长度(int)的摘要,因此它不是唯一的,并且具有冲突。您可以在我插入链接的文档中找到hashcode的规则。
如果你想了解更多,你可能想看看javapractices.com和technofundo.com上的文章
问候