将重复的密钥放入哈希映射中时会发生什么情况?

2022-08-31 05:07:12

如果我多次将同一密钥传递给 的方法,原始值会发生什么情况?如果连值都重复呢?我没有找到任何关于此的文档。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


答案 1

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

地图只是删除其对值的引用。如果没有其他任何内容包含对该对象的引用,则该对象将有资格进行垃圾回收。此外,Java 还会返回与给定键关联的任何先前值(如果不存在),因此您可以确定存在的内容并在必要时维护引用。null

更多信息在这里: HashMap Doc


答案 2

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

public V put(K key,
             V value)

将指定值与此映射中的指定键相关联(可选操作)。如果映射以前包含此键的映射,则旧值将替换为指定的值。(当且仅当 m.containKey(k) 返回时,映射才称为包含键的映射。mktrue

参数:
- 要与指定值关联的键。
- 要与指定键关联的值。keyvalue

返回:
与指定键关联的上一个值,或者如果没有 的映射。(如果实现支持值,则返回值还可以指示先前与指定映射相关联的映射。nullkeynullnullkeynull

因此,如果在调用 时未分配返回值,则它只是未被引用,因此符合垃圾回收的条件。mymap.put("1", "a string")