Java中的STL-Hashtable

本文深入探讨了Java中的STL-Hashtable,一个线程安全的Map实现。详细介绍了Hashtable的特性,包括其与HashMap的不同之处,如线程安全性、遍历方式及内部实现细节。此外,还对比了两者在table capacity上的差异。

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

Java中的STL-Hashtable

public class Hashtable<K,V> extends Dictionary<K,V> implements Map<K,V>, Cloneable, java.io.Serializable 

image

  • 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如出一辙,有兴趣的朋友可以看看。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值