java - 当 String 作为键时,什么会导致 HashMap containsKey() 失败?

标签 java hashmap containskey

我对这个完全困惑了。我正在运行完整的单元测试包。以下是许多 JUnit 测试使用的相关共享代码:

private static Map<String, JAXBContext> jaxbContexts = 
                             new HashMap<String, JAXBContext>();

private synchronized JAXBContext getJAXBContext(Class clazz) throws JAXBException {
    JAXBContext context = null;
    if (jaxbContexts.containsKey(clazz.getName())) {
        context = jaxbContexts.get(clazz.getName());
    } else {
        context = JAXBContext.newInstance(clazz);
        System.out.println("Created new context for '" + clazz.getName() + "'");
        jaxbContexts.put(clazz.getName(), context);
    }
    return context;
}

JUnit 运行的控制台输出包括以下两个连续条目:

Created new context for 'com.somecompany.xmlschema.providepensionpaymentinfo.Interface'
Created new context for 'com.somecompany.xmlschema.providepensionpaymentinfo.Interface'

我错过了什么?与 JUnit 执行期间的其他 46 次不同,为什么 jaxbContexts.containsKey() 在此实例中对于基于字符串的键不起作用?我们没有并行运行测试,但如果这会产生影响,我们确实会使用方面。

最佳答案

对其进行调试并验证包含此 getJAXBContext() 方法的类是否仅实例化一次(通过检查它在 Debug模式下每次调用时是否具有相同的内存 ID)。如果是不同的实例化,synchronized关键字将锁定不同的锁,并且它们将使用不同的映射。

关于java - 当 String 作为键时,什么会导致 HashMap containsKey() 失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4748188/

相关文章:

java - java中二维数组的排序和反转

java - 比较器和一致等于 : How?(最佳实践)

java - Java中如何连接两个ArrayList

java - HashMap 值未附加到 ListView

Java TreeMap 包含一个键但调用 containsKey 返回 false(即使键是完全相同的未更改对象)

java - 如何在周三下午 1 点(每周一次)在 Android 中重复闹钟

java - OpenCV、安卓 : color detection from particular area or portion of an image?

c++ - HashMap 和 vector 很慢

c# - 自定义类用作字典中的键但找不到键