1. 程式人生 > >TreeMap中的鍵,值能否為null?

TreeMap中的鍵,值能否為null?

今天想到一個問題,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. 我們來總結一下:

  1. 當未實現 Comparator 介面時,key 不可以為null,否則拋 NullPointerException 異常;

  2. 當實現 Comparator 介面時,若未對 null 情況進行判斷,則可能拋 NullPointerException 異常。如果針對null情況實現了,可以存入,但是卻不能正常使用get()訪問,只能通過遍歷去訪問。

現在我們知道了,如果去使用TreeMap的時候,還是需要鍵為null的情況的。

現在晚上12點10分了,回宿舍睡覺了,明天再戰,加油!