如何获取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
相关产品推荐
相关产品推荐

