java需要关注的知识点---Hashtable

本文详细介绍了Hashtable的工作原理,包括其put方法的实现细节及rehash过程。对比了Hashtable与HashMap的不同之处,如不允许空键值、下标计算方式等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在concurrentHashMap出来之前,hashtable一直是作为线程安全的map使用。
hashtable默认的初始大小是:11.
1.Hashtable中的put方法。
Java代码   收藏代码
  1.  public synchronized V put(K key, V value) {  
  2. // Make sure the value is not null  
  3. if (value == null) {  
  4.     throw new NullPointerException();  
  5. }  
  6.   
  7. // Makes sure the key is not already in the hashtable.  
  8. Entry tab[] = table;  
  9. int hash = key.hashCode();  
  10. int index = (hash & 0x7FFFFFFF) % tab.length;  
  11. for (Entry<K,V> e = tab[index] ; e != null ; e = e.next) {  
  12.     if ((e.hash == hash) && e.key.equals(key)) {  
  13.     V old = e.value;  
  14.     e.value = value;  
  15.     return old;  
  16.     }  
  17. }  
  18.   
  19. modCount++;  
  20. if (count >= threshold) {  
  21.     // Rehash the table if the threshold is exceeded  
  22.     rehash();  
  23.   
  24.            tab = table;  
  25.            index = (hash & 0x7FFFFFFF) % tab.length;  
  26. }  
  27.   
  28. // Creates the new entry.  
  29. Entry<K,V> e = tab[index];  
  30. tab[index] = new Entry<K,V>(hash, key, value, e);  
  31. count++;  
  32. return null;  
  33.    }  

    1.1 不同于HashMap,Hashtable不允许出现空的key.
    1.2 不同于HashMap,下标计算方式
           HashMap : h & (length-1)
           Hashtable: (hash & 0x7FFFFFFF) % tab.length
2 Hashtable中的rehash方法:
Java代码   收藏代码
  1.   protected void rehash() {  
  2. int oldCapacity = table.length;  
  3. Entry[] oldMap = table;  
  4.   
  5. int newCapacity = oldCapacity * 2 + 1;  
  6. Entry[] newMap = new Entry[newCapacity];  
  7.   
  8. modCount++;  
  9. threshold = (int)(newCapacity * loadFactor);  
  10. table = newMap;  
  11.   
  12. for (int i = oldCapacity ; i-- > 0 ;) {  
  13.     for (Entry<K,V> old = oldMap[i] ; old != null ; ) {  
  14.     Entry<K,V> e = old;  
  15.     old = old.next;  
  16.   
  17.     int index = (e.hash & 0x7FFFFFFF) % newCapacity;  
  18.     e.next = newMap[index];  
  19.     newMap[index] = e;  
  20.     }  
  21. }  
  22.    }  

      Hashtable的增长方式是按照原有长度的2倍再加上1的方式进行增长的,不同于hashMap,hashMap是按照原有长度的2倍。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值