get 方法使用了 synchronized 来修饰,所以它能保证线程安全。并且它是通过链表的方式来处理冲突的。另外,我们还可以看见 HashTable 并没有像 HashMap 那样封装一个哈希函数,而是直接把哈希函数写在了方法中。而哈希函数也是比较简单的,它仅对哈希表的长度进行了取模。
publicsynchronizedVget(Object key){Entry<?,?> tab[]= table;int hash = key.hashCode();//通过哈希函数,计算出key对应的桶的位置.int index =(hash &0x7FFFFFFF)% tab.length;//遍历该桶的所有元素,寻找该key.for(Entry<?,?> e = tab[index]; e !=null; e = e.next){if((e.hash == hash)&& e.key.equals(key)){return(V)e.value;}}returnnull;}
4. put 方法
put 方法一开始就表明了不能有 null 值,否则就会向你抛出一个空指针异常。Hashtable 的 put 方法也是使用 synchronized 来修饰。在 Hashtable 中,几乎所有的方法都使用了 synchronized 来保证线程安全。
publicsynchronizedVput(K key,V value){// Make sure the value is not nullif(value ==null){thrownewNullPointerException();}// Makes sure the key is not already in the hashtable.Entry<?,?> tab[]= table;int hash = key.hashCode();//计算桶的位置int index =(hash &0x7FFFFFFF)% tab.length;@SuppressWarnings("unchecked")Entry<K,V> entry =(Entry<K,V>)tab[index];//遍历桶中的元素,判断是否存在相同的 keyfor(; entry !=null; entry = entry.next){if((entry.hash == hash)&& entry.key.equals(key)){V old = entry.value;
entry.value = value;return old;}}//不存在相同的 key,则把该 key 插入到桶中addEntry(hash, key, value, index);returnnull;}privatevoidaddEntry(int hash,K key,V value,int index){
modCount++;Entry<?,?> tab[]= table;//哈希表的键值对个数达到了阈值,则进行扩容if(count >= threshold){// Rehash the table if the threshold is exceededrehash();
tab = table;
hash = key.hashCode();
index =(hash &0x7FFFFFFF)% tab.length;}// Creates the new entry.@SuppressWarnings("unchecked")Entry<K,V> e =(Entry<K,V>) tab[index];//把新节点插入桶中(头插法)
tab[index]=newEntry<>(hash, key, value, e);
count++;}
5. remove 方法
publicsynchronizedVremove(Object key){Entry<?,?> tab[]= table;int hash = key.hashCode();int index =(hash &0x7FFFFFFF)% tab.length;@SuppressWarnings("unchecked")Entry<K,V> e =(Entry<K,V>)tab[index];for(Entry<K,V> prev =null; e !=null; prev = e, e = e.next){if((e.hash == hash)&& e.key.equals(key)){
modCount++;if(prev !=null){
prev.next = e.next;}else{
tab[index]= e.next;}
count--;V oldValue = e.value;
e.value =null;return oldValue;}}returnnull;}