一篇文章带你搞定HashTable

在咱们开讲源码之前,首先需要了解下什么是哈希表?

散列表(Hash table 又称哈希表),是根据关键码值(Key value)而直接进行访问的数据结构.也就是说,它通过把关键码值映射到表中的一个位置来访问记录,以加快查找的速度.这个映射函数就叫做散列函数,存放记录的数组叫做散列表.              —— 百度百科

如图:

在Java中HashTable以数组+链表来实现,相对于HashMap来说要简单得多.HashTable不同于HashMap,它内部不允许插入null值,同时它是线程安全的,所有的读写操作都进行了锁保护,但也难以避免的对读写效率产生了较大影响.因此在日常开发中为保证线程安全一般建议使用ConcurrentHashMap.

为啥Java中Hashtable中的t要小写? 这不符合驼峰命名规则啊

stack overflow

大意: Hashtable创建于Java1,而集合的统一命名规范是后来在Java2中建立的,而当时又发布了新集合来代替它,再加上大量Java程序使用Hashtable类,考虑到兼容问题不可能将Hashtable改为HashTable.同时Hashtable已经过时了,不建议在代码中使用.

源码分析

结构图

继承关系

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

Dictionary是JDK1.0里引入的抽象类,用于存储键/值对,作用和Map类似.注意Dictionary类已经过时了,在实际开发中,可以通过实现Map接口来完成存储键值对的功能.

类中属性

    /** 内部维护了一个 Entry 数组 */
    private transient Entry<?,?>[] table;

    /** 哈希表里的元素数量 */
    private transient int count;

    /** 触发扩容的阈值 */
    private int threshold;

    /** 加载因子 默认 0.75 */
    private float loadFactor;

    /** 记录 涉及到结构变化的次数(offer/remove/clear等)  */
    private transient int modCount = 0;

    /** 版本号 */
    private static final long serialVersionUID = 1421746759512286392L;

table数组里存的Entry实际上是一个单向链表,哈希表的键值对都是存在table里的.

 private static class Entry<K,V> implements Map.Entry<K,V> {
        final int hash;
        final K key;
        V value;
        Entry<K,V> next;
        
        ...
    }

构造函数

    public Hashtable() {
    this(11, 0.75f); }
    
    public Hashtable(int initialCapacity) {
    this(initialCapacity, 0.75f); }

    public Hashtable(int initialCapacity, float loadFactor) {
   
        if (initialCapacity < 0)
            throw new IllegalArgumentException("Illegal Capacity: "+ initialCapacity);
        if (loadFactor <= 0 || Float.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值