1.從源碼分析
HashMap從源碼分析:
HashMap在put的時候會調用hash()方法來計算key的hashcode值钉鸯,可以從hash算法中看出當key==null時返回的值為0季惯。因此key為null時,hash算法返回值為0翎嫡,不會調用key的hashcode方法欠动。
HashTable從源碼分析:
上面可以看出當HashTable存入的value為null時,拋出NullPointerException異常钝的。如果value不為null翁垂,而key為空,在執(zhí)行到int? hash = key.hashCode()時同樣會拋出NullPointerException異常
2.從設計師角度分析
HashTable是Java中的遺留類硝桩,現(xiàn)在不怎么用了沿猜,這里HashMap vs HashTable有個解釋。也許HashTable類的設計者當時認為null作為key 和value 是沒有什么用的碗脊。
HashMap是之后的版本引進的類啼肩,它的接口Map表達的意義更為廣泛,也許HashMap的設計者認為null作為key和value是有實際意義的衙伶,所以才允許為null.
當然實際項目中祈坠,真的是有value為null的情況的。key為null的情況比較少見矢劲,但不代表沒有赦拘。HashMap允許null為key和value應當是類的設計者思考讓這個類更有用的設計吧。