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

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

今天我就用 HashMap、Hashtable、ConcurrentHashMap、TreeMap 這幾種開發中常用資料結構來測試下。

結論在前

其實大家去看下原始碼測試下就可以得到以下結論:

HashMap key 和 value 都可以為空

Hashtable key 和 value 都不能為空

ConcurrentHashMap key 和 value 都不能為空

TreeMap key不能為 null,value 可以為空

為空時丟擲的都是 NPE (NullPointException)

HashMap

測試程式碼

Map 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 hashtable = new Hashtable<>();hashtable。put(null, “”);System。out。println(hashtable);hashtable。put(“”, null);System。out。println(hashtable);複製程式碼

輸出

測試 hashtable。put(null, “”);輸出

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

測試 hashtable。put(null, null);輸出

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

原因

測試 key是否為空,put 方法中獲取 null 的 hashCode方法,會丟擲NPE

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

測試 value是否可以為空,put方法裡會有判斷

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

ConcurrentHashMap

ConcurrentHashMap concurrentHashMap = new ConcurrentHashMap<>();concurrentHashMap。put(null, null);System。out。println(concurrentHashMap);複製程式碼

結果

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

結論

key 和 value 都不能為空

原因

ConcurrentHashMap的put方法中有判斷

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

TreeMap

測試程式碼

TreeMap treeMap = new TreeMap<>();treeMap。put(null, “”); // NPEtreeMap。put(“”, null); // 可以透過treeMap。put(null, null); // NPESystem。out。println(treeMap);複製程式碼

輸出

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

原因

用預設的比較方式比較key,所以key不能為 null

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

但是儲存 value 可以為 null

結論

key不能為 null,value 可以為 null

結論在後

HashMap key 和 value 都可以為空

Hashtable key 和 value 都不能為空

ConcurrentHashMap key 和 value 都不能為空

TreeMap key不能為 null,value 可以為空

為空時丟擲的都是 NPE (NullPointException)

作者:iuuuuuaena

連結:https://juejin。cn/post/7043278442644635679

著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。