java中的Hashtable概念和基础用法

本文深入解析哈希表(Hashtable)的工作原理,涵盖其概念、源代码解析、性能影响因素及基本用法。通过实例演示如何使用哈希表进行数据存储与检索,探讨不同构造函数的使用场景,并对比Hashtable与HashMap、ConcurrentHashMap的线程安全性。

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

Hashtable

 

[1]参考资料:JDK1.8 api文档、Hashtable源代码、百度百科

 

[2]概念

  Hashtable(哈希表) 也可以叫做散列表,是根据关键码值(Key value)而直接进行访问的数据结构,通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度

通过代码来理解:

  Hashtable <key , value>    前面是key(代表键),后面是value(代表值)

public static void main(String[] args) {
        Hashtable ht=new Hashtable();
        ht.put("aaa","hash");
        ht.put("bbb","table");
        System.out.println(ht.get("bbb"));
}

  上面代码中通过put(key,value)的方式把值存进对应的键中,再通过put(key)的方式把键中的值拿出来(通过访问key,拿到value,就是通过这种方式加快访问速度)。

 

[3]Hashtable源代码

创建Hashtable对象

1.public Hashtable()                                      

   构造一个新的,空的散列表,默认初始容量(11)负载因子(0.75)

通过源代码来理解:

  使用Hashtable()时,代码会用 this(11,0.75f) 去指向 Hashtable(int initialCapacity, float loadFactor),可以理解成不填入初始容量和负载因子,代码会给你个默认值(初始容量默认11,负载因子默认0.75)。

注:源代码中都存在着一些方便理解的注释(英文不好只能靠翻译了)。

 

2.public Hashtable(int initialCapacity)

通过源代码来理解:

    使用Hashtable(int initialCapacity)时,代码会用 this(initialCapacity,0.75f) 去指向 Hashtable(int initialCapacity, float loadFactor),可以理解成只填入初始容量,代码会给你个补充一个负载因子的默认值(初始容负载因子默认0.75)。

3. public Hashtable(int initialCapacity, float loadFactor)

通过源代码来理解:

    使用Hashtable(int initialCapacity, float loadFactor)时,代码会检查初始容量是否小于0、加载因子小于等于0、加载因子是否是NAN,符合则会抛出IllegalArgumentException异常(如果对Float.isNaN()有疑惑可以看看这篇博客:从源码的角度分析 Java 中的 Float.isNaN() )

  初始容量为0的话,代码会给初始容量赋值1

知识点: 1.初始容量不能小于0 

               2.负载因子不能小于等于0

               3.负载因子不能是非数字(NaN)  例如:0.0f/0.0f  或者 sqrt(-1)

 

[4]Hashtable性能(摘自JDK1.8api文档)

  • 影响性能的两个参数:初始容量负载因子,容量是哈希表中的桶数, 初始容量只是创建哈希表时的容量。 请注意,哈希表是打开的 :在“哈希冲突”的情况下,单个存储桶存储多个条目,必须依次搜索。 负载因子是在容量自动增加之前允许哈希表得到满足的度量。
  • 默认负载因子(0.75)提供了时间和空间成本之间的良好折衷。 更高的值会减少空间开销但会增加查询条目的时间成本(这反映在大多数Hashtable操作中,包括get和put )。
  • 初始容量控制了浪费空间与需要rehash操作之间的折中,这是耗时的。 没有rehash如果初始容量大于项Hashtable将其负载因子包含除以最大数量永远不会发生的操作。 然而,设置初始容量太高可能会浪费空间

  • 如果不需要线程安全的实现,建议使用HashMap代替Hashtable 。 如果需要线程安全的并发实现,那么建议使用ConcurrentHashMap代替Hashtable

[5]Hashtable基础用法

1.赋值

public static void main(String[] args) {
    Hashtable ht=new Hashtable();
    ht.put("aaa","hash");
    ht.put("bbb","table");
    System.out.println(ht);
}

2.清除

public static void main(String[] args) {
    Hashtable ht=new Hashtable();
    ht.put("aaa","hash");
    ht.put("bbb","table");
    ht.clear();
    System.out.println(ht);
}

3.取值

public static void main(String[] args) {
        Hashtable ht=new Hashtable();
        ht.put("aaa","hash");
        ht.put("bbb","table");
        System.out.println(ht.get("bbb"));
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值