HashMap、Hashtable、ConcurrentHashMap
不同点:
HashMap是线程不安全的,没有synchronized关键字。Hashtable是线程安全的,有synchronized关键字。HashMap可以put为null的key,并且能得到相应的value值。Hashtable不能put为null的key和value值,否则会报NullPointerException,原因在于Hashtable用了key.hashCode()来做一些计算,而HashMap并没有用key的一些方法来做计算
ConcurrentHashMap用到了key做hash运算,所以不能put为null的key
HashSet
HashSet的底层是由HashMap来实现的,利用了HashMap在put一个新的key时会返回一个null值的特性来判断是否添加成功,如果为null则说明HashSet添加元素成功(添加了一个新的key),否则失败。这样就能使HashSet有不能添加重复元素的特性(即使添加了多个重复的元素,也只相当添加了一个)。由于HashSet的底层是HashMap,所以HashSet是能添加null的