【发布时间】:2021-06-13 23:29:00
【问题描述】:
我有一个链接的哈希映射,它存储随机 6 个字符字符串作为键和 30 个字符字符串作为值。当我调用替换方法时,它应该替换给定键的值并返回与给定键关联的现有值。
代码
Map cache = new LinkedHashMap<String, String>();
protected boolean registerCache(String key, String val) {
System.out.println("Registering key "+ key +" associated with : "+val);
String result = cache.put(key, val);
System.out.println("Replacement result "+result);
return result == null;
}
protected synchronized boolean updateCache(String key, String val) {
System.out.println("map before replace : "+cache.toString());
String replaced = cache.replace(key, val);
System.out.println("replacing "+replaced+" with "+val);
return replaced != null;
}
注册缓存第一次存储键值,然后更新方法应该替换注册键的值。 但是 4 次有一次,它无法更换。它表现为密钥从未注册过。这是输出:
Registering key \b?}`& associated with : Vtw7vd3Mtk9DEImmZAxfazKrckVpt4
Replacement result null
map before replace: {
d\ZDO<=9pw7cEjdnvWhpbxar564kiSkVpt4Z1,
pHQ)j\=9pw7cEjdnvWhpbxar564kiSkVpt4Z1,
0''nEY=KxE7vdInrD2goNOU5LdMFdEMgsCh-1,
C\Gude=KxE7vdInrD2goNOU5LdMFdEMgsCh-1,
\b?}`&=Vtw7vd3Mtk9DEImmZAxfazKrckVpt4}
replacing null with KxE7vdInrD2goNOU5LdMFdEMgsCh-1
如果我做错了什么,请提出建议。我怀疑生成的密钥不应该是随机字符字符串。
【问题讨论】:
-
您将哪些值传递给
updateCache?请提供一个最小的可重现示例stackoverflow.com/help/minimal-reproducible-example -
这种情况会发生每 4 次吗?此外,问题似乎在于您传递的值,而不是密钥。变量
String replaced不是键,而是你替换的值 -
随机 6 个字符的字符串作为键和 30 个字符的字符串作为值。密钥被正确传递,并且该部分正在另一个类中处理,所以我只提到了问题代码。
-
方法
Map.put(K, V)和Map.replace(K, V)都返回V。所以你只打印值,而不是键。这是你的意图吗? -
您可以添加
System.out.println("key and value before replace : "+key+" - "+cache.get(key));以验证键和旧值是否符合预期。
标签: java hashmap linkedhashmap