1, HashSet
HashSet是基于HashMap实现的,HashSet底层使用HashMap来保存所有元素,因此HashSet 的实现比较简单,相关HashSet的操作,基本上都是直接调用底层HashMap的相关方法来完成,
transient HashMap<E, HashSet<E>> backingMap; // //存储元素的实体数组
说白了HashSet只是HashMap表中value值为HashSet特定类型的特殊HashMap,就是只有一个key值的HashMap的集合。Set是数学中定义的集合,所以元素无序,并且不能重复添加。
2, Hashtable
查看源码,发现Hashtable几乎和HashMap的实现完全一样,所以直接论述它们不同的地方,
1, 历史原因。Hashtable是基于陈旧的Dictionary类的,HashMap是Map接口的一个实现.
2,添加元素时, HashMap可以接受为null的键值(key)和值(value),而Hashtable则不行.
3, HashMap是非synchronized,而HashTable是synchronized,这意味着HashTable是线程安全的.所以在不需要同步的情况下应当使用HashMap。
4, HashMap的迭代器(Iterator)是fail-fast迭代器,而Hashtable的enumerator迭代器不是fail-fast的。所以当有其它线程改变了HashMap的结构(增加或者移除元素),将会抛出ConcurrentModificationException,但迭代器本身的remove()方法移除元素则不会抛出ConcurrentModificationException异常.
HashMap可以通过下面的语句进行同步:
Map m =Collections.synchronizeMap(hashMap);
并且,现在如果需要同步,可以使用ConcurrentHashMap而不是Hashtable
3, LinkedHashMap
LinkedHashMap继承与HashMap,与HashMap最大不同之处在于,
HashMap中的散列表是一个单向链表,而LinkedHashMap中的散列表是双向链表,因此在散列表元素比较多的情况下, LinkedHashMap查找删除的效率更高。
private static final float LOAD_FACTOR = 0.75f;// 加载因子
transient volatile Node<K,V>[] table;// 数组大小是2的整数次幂