HashTable详解

本文详细介绍了Java中的HashTable,包括其结构、原理、重要字段、操作方法以及与HashMap的区别。HashTable作为线程安全的Map实现,其内部通过链表解决哈希冲突,但在性能上低于非线程安全的HashMap。此外,文章还提到了HashTable的迭代器Enumerator与HashMap的Iterator之间的差异。
摘要由CSDN通过智能技术生成

HashTable概述

HashTable和HashMap的原理是一样的。都是一个哈希表的数据结构。

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

HashTable同样是Map接口下的一员,它还继承了Dictionary这个类。这个是一个任何字典类型的类的抽象父类,里面定义的是字典数据结构的基本必要操作。

HashTable结构

在这里插入图片描述

HashTable的结构和HashMap的结构是差不多的。HashTable中没有引进红黑树。所有的冲突Entry都是通过链表保存的。

HashTable原理解析

重要字段

    /**
     * hash表数组
     */
    private transient Entry<?,?>[] table;

    /**
     * 记录table中保存entry的条数
     */
    private transient int count;

    /**
     * hash表进行rehash的阈值,计算公式是
     * capacity * loadFactor)
     *
     * @serial
     */
    private int threshold;

    /**
     * 负载因子
     *
     * @serial
     */
    private float loadFactor;

    /**
     * 实现fast-fail机制
     */
    private transient int modCount = 0;

    /** use serialVersionUID from JDK 1.0.2 for interoperability */
    private static final long serialVersionUID = 1421746759512286392L;
    /**
     * keySet用于存放容器中的所有key
     * values用于存放容器中的所有value
     * entrySet以set容器形式存放Entry,一般遍历Hashtable会用到此属性
     */
    private transient volatile Set<K> keySet;
    private transient volatile Set<Map.Entry<K,V>> entrySet;
    private transient volatile Collection<V> values;

基本的字段和HashMap还是差不多的。

构造方法

public Hashtable(int initialCapacity, float loadFactor) {
   
	// 检查initialCapacity、loadFactor参数的合法性
    if (initialCapacity < 0)
        throw new IllegalArgumentException("Illegal Capacity: "+ initialCapacity);
    if (loadFactor <= 0 || Float.isNaN(loadFactor))
        throw new IllegalArgumentException("Illegal Load: "+loadFactor);
	// 忙活了半天不能初始化空的容器吧。。。
    if (initialCapacity==0)
        initialCapacity = 1;
    this.loadFactor = loadFactor;
    table = new Entry<?,?>[initialCapacity];
    // 计算容器可存放的key-value数量阈值,容量 * 负载因子
    threshold = (int)Math.min(initialCapacity * loadFactor, MAX_ARRAY_SIZE + 1)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值