将重复密钥放入HashMap时会发生什么?
如果我多次将相同的密钥传递给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"));
我们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?