TreeMap中的鍵,值能否為null?
阿新 • • 發佈:2019-01-30
今天想到一個問題,HashMap中鍵值都可以為null,ConcurrentHashMap,HashTable中鍵值不可以為null,
那麼TreeMap呢?
我們一起來看一下吧。
1. 首先, 先分析簡單的, value是否能為null?
public static void main(String[] args) { TreeMap<String, Integer> treeMap = new TreeMap<>(); treeMap.put("1",1); treeMap.put("2",null); System.out.println(treeMap.get("2")); }
結果:
null
value是可以為null的。
2. 再來看看 key 是否能是 null
public static void main(String[] args) {
TreeMap<String, Integer> treeMap = new TreeMap<>();
treeMap.put("1",1);
treeMap.put(null,null);
System.out.println(treeMap.get("2"));
}
結果:
Exception in thread "main" java.lang.NullPointerException at java.util.TreeMap.put(TreeMap.java:563) at com.crazy_june.test_treemap.main(test_treemap.java:9)
出錯,空指標異常 NullPointerException。
3.TreeMap是需要我們實現Comparator介面的,上面的例子中String是自己實現了Comparator介面的,我們自己來實現一個Comparator看看。
public static void main(String[] args) { TreeMap<String, Integer> treeMap = new TreeMap<>(new Comparator<String>() { @Override public int compare(String o1, String o2) { if(o1==null){ return 1; }else { return o2.charAt(0)-o1.charAt(0); } } }); treeMap.put("1",1); treeMap.put(null,12); treeMap.put("2",2); System.out.println(treeMap.get(null)); }
結果:
null
可以看到,結果並不能取出來,我們試試遍歷entry看看:
for(Map.Entry<String,Integer> entry:treeMap.entrySet()){
System.out.println(entry.getKey()+":"+entry.getValue());
}
結果:
2:2
1:1
null:12
結果看到了吧。
4. 我們來總結一下:
-
當未實現 Comparator 介面時,key 不可以為null,否則拋 NullPointerException 異常;
-
當實現 Comparator 介面時,若未對 null 情況進行判斷,則可能拋 NullPointerException 異常。如果針對null情況實現了,可以存入,但是卻不能正常使用get()訪問,只能通過遍歷去訪問。
現在我們知道了,如果去使用TreeMap的時候,還是需要鍵為null的情況的。
現在晚上12點10分了,回宿舍睡覺了,明天再戰,加油!