Java的一些字典是否可以存储 null?

爪哇的一些字典是否可以存储 null?

今天我就用 HashMapHashtableConcurrentHashMapTreeMap 这几种开发中常用数据结构来测试下。

结论在前

其实大家去看下源码测试下就可以得到以下结论:

  • HashMap key 和 value 都可以为空
  • Hashtable key 和 value 都不能为空
  • ConcurrentHashMap key 和 value 都不能为空
  • TreeMap key不能为 null,value 可以为空

为空时抛出的都是 NPENullPointException

HashMap

测试代码

Map<String, String> hashMap = new HashMap<>();
hashMap.put(null, null);
System.out.println(hashMap.get(null));
System.out.println(hashMap);
复制代码

输出

null
{null=null}
复制代码

结论

hashMap key 可以 存储 null, value 也可以 存储 null

Hashtable

测试代码

Hashtable<String, String> hashtable = new Hashtable<>();
hashtable.put(null, "");
System.out.println(hashtable);
hashtable.put("", null);
System.out.println(hashtable);
复制代码

输出

测试 hashtable.put(null, "");输出

image-20211219124751536.png

测试 hashtable.put(null, null);输出

image-20211219124826589.png

原因

测试 key是否为空,put 方法中获取 null 的 hashCode方法,会抛出NPE

image-20211219124716562.png

测试 value是否可以为空,put方法里会有判断 image-20211219124944592.png

ConcurrentHashMap

ConcurrentHashMap<String, String> concurrentHashMap = new ConcurrentHashMap<>();
concurrentHashMap.put(null, null);
System.out.println(concurrentHashMap);
复制代码

结果

image-20211219125314368.png

结论

keyvalue 都不能为空

原因

ConcurrentHashMapput方法中有判断 image-20211219125121974.png

TreeMap

测试代码

TreeMap<String, String> treeMap = new TreeMap<>();
treeMap.put(null, "");  // NPE
treeMap.put("", null);  // 可以通过
treeMap.put(null, null); // NPE
System.out.println(treeMap);
复制代码

输出

image-20211219125926029.png

原因

用默认的比较方式比较key,所以key不能为 null

image-20211219125848472.png

但是存储 value 可以为 null

结论

key不能为 null,value 可以为 null

结论在后

  • HashMap key 和 value 都可以为空
  • Hashtable key 和 value 都不能为空
  • ConcurrentHashMap key 和 value 都不能为空
  • TreeMap key不能为 null,value 可以为空

为空时抛出的都是 NPENullPointException

猜你喜欢

转载自juejin.im/post/7043278442644635679