【问题标题】:LinkedHashMap: replace method fails to replace value for spacified keyLinkedHashMap:replace 方法无法替换指定键的值
【发布时间】: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


【解决方案1】:

我找到了原因。 正如 Thomas 在上面的评论中所建议的那样,我为需要替换值的键添加了更多 sysout。
我使用RandomStringUtils.randomAscii(6)(来自commons library)来生成密钥。生成的密钥有一些用空格打印的字符,因此没有正确找到密钥来替换它的值。
当我将 RandomStringUtils.randomAscii(6) 替换为 RandomStringUtils.randomAlphanumeric(8) 时,它的行为符合预期。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-29
    • 1970-01-01
    • 2011-02-17
    • 2012-06-23
    相关资源
    最近更新 更多