Java中的STL-Hashtable
public class Hashtable<K,V> extends Dictionary<K,V> implements Map<K,V>, Cloneable, java.io.Serializable
- Hashtable继承Dictionary,实现Map接口
- Hashtable和HashMap的实现方式很相似,都是通过拉链法保存数据.
- 但是由于Hashtable每个函数都用关键字syncrosized控制,所以它是线程安全的。
- HashMap的iterator遍历,Hashtable可以通过Enumerator遍历, 并且是倒着遍历table的。
主要的API
synchronized void clear()
synchronized Object clone()
boolean contains(Object value)
synchronized boolean containsKey(Object key)
synchronized boolean containsValue(Object value)
synchronized Enumeration<V> elements()
synchronized Set<Entry<K, V>> entrySet()
synchronized boolean equals(Object object)
synchronized V get(Object key)
synchronized int hashCode()
synchronized boolean isEmpty()
synchronized Set<K> keySet()
synchronized Enumeration<K> keys()
synchronized V put(K key, V value)
synchronized void putAll(Map<? extends K, ? extends V> map)
synchronized V remove(Object key)
synchronized int size()
synchronized String toString()
synchronized Collection<V> values()
和HashMap的源码实现上的不同点
HashMap和Hashtable除了以上列出的几个不同点之外,源码中还有一些不同点。
- table的capacity
在HashMap中,table的capacity初始值如果不手动设置的话是16,如果设置的话,下次resize()还是会设置成16,并且往后每次resize都是原capacity的2倍,这就造成了HashMap中table的size总是2的整数次幂。HashMap在插入或删除数据时候,都用到了这一特点,利用 int index = key.hash & (table.length - 1)
的方式取余,来确定key在table中的位置。但是Hashtable不一样,如果不设置初始capacity,初始capacity是11,每次rehash都将 capacity = capacity << 1 + 1,也就是乘2再加一。这样,就不能按照原来的方式取余了,hashtable是这样做的int index = (hash & 0x7FFFFFFF) % tab.length;
, 直接忽略掉hash的高五位,除以长度取余。
其余的API的实现和HashMap如出一辙,有兴趣的朋友可以看看。