You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取HashMap中被覆盖的旧值?同键是否会产生哈希碰撞?

HashMap覆盖值、存在性及哈希碰撞问题解答

首先先还原你的代码和对应的输出:

Map<String,String> mapp=new HashMap<>();
mapp.put("1", "abc");
mapp.put("1", "def");
System.out.println(mapp.size());
System.out.println(mapp.get("1"));
System.out.println(mapp);

执行输出:

1
def
{1=def}

咱们来逐个解决你提出的问题:

1. 如何获取被覆盖的'abc'值?

很遗憾,默认的HashMap在执行put操作时,如果键已存在,会直接用新值覆盖旧值,且不会自动保留旧值。如果想要拿到被覆盖的"abc",你只能在执行第二次put前手动保存旧值,比如这样写:

Map<String,String> mapp=new HashMap<>();
// 第一次put,因为键"1"不存在,返回null
String oldValue = mapp.put("1", "abc");
// 第二次put,键"1"已存在,返回被覆盖的旧值"abc",我们把它存下来
oldValue = mapp.put("1", "def");
// 现在oldValue里就保存着"abc"了
System.out.println(oldValue); // 输出abc

要是没提前做这个保存操作,一旦完成第二次put,旧值"abc"就会失去HashMap的引用,最终会被Java的垃圾回收机制清理掉,之后就再也没法获取到它了。

2. 该值在集合size为1时是否仍存在?

不存在了。当你用相同键执行第二次put后,HashMap只是替换了该键对应的旧值,集合的size保持1(因为键的数量没有增加或减少),但旧值"abc"已经不在HashMap的存储结构里了,它只是一个没有被任何引用指向的对象,等着被垃圾回收器回收。

3. 这种情况是否属于哈希碰撞?

这完全不属于哈希碰撞。哈希碰撞的定义是:两个不同的键生成了相同的哈希码,导致它们被分配到HashMap的同一个桶(bucket)中。而你的例子里是同一个键"1",它的哈希码必然是相同的,第二次put只是替换该键对应的值,根本没有出现不同键竞争同一个桶的场景,所以和哈希碰撞没有关系。


内容的提问来源于stack exchange,提问作者card

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:05:46