在Java中将地图转换为ConcurrentMap时出错

时间:2019-01-15 07:43:44

标签: java java.util.concurrent

我有一个Map<String,Object>要转换为ConcurrentMap<String,Object>

    Map<String,Object> testMap = new HashMap<String,Object>();
    testMap.put("test", null); //This null causing issues in conversion
    testMap.put("test2","123");
    testMap.put("test3",234);
    ConcurrentMap<String,Object> concMap = new ConcurrentHashMap<>(testMap);

我得到一个空指针异常。如果我复制到新的HashMap<String,Object>

    Map<String,Object> testMap = new HashMap<String,Object>();
    testMap.put("test", null);
    testMap.put("test2","123");
    testMap.put("test3",234);
    Map<String,Object> concMap = new HashMap<>(testMap);

我没有任何错误。有没有Map<String,Object>

的从ConcurrentMap<String,Object>NullPointerException的安全方法

3 个答案:

答案 0 :(得分:2)

它在documentation for ConcurrentHashMap中:

  

类似于Hashtable,但与HashMap不同,此类不允许将null用作键或值。

对于其他ConcurrentMap,the only other implementation ConcurrentSkipListMap, does not allow null either

答案 1 :(得分:2)

如果您查看ConcurrentHashMap的源代码,您将看到它不允许使用null键或值-

java.util.concurrent.ConcurrentHashMap#putVal

/** Implementation for put and putIfAbsent */
final V putVal(K key, V value, boolean onlyIfAbsent) {
    if (key == null || value == null) throw new NullPointerException();

答案 2 :(得分:0)

问题不在于将HashMap转换成ConcurrentHashMap。它更多地是关于ConcurrentHashMap是null安全的,它不允许null值。从其documentation

  

类似于Hashtable,但与HashMap不同,此类不允许 null用作键或值。