Java 集合 (7) -- HashTable 类

1. 简介

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

HashTable 继承了 Dictionary 类,实现了 Map 接口。其中 Dictionary 类是任何可将键映射到相应值的类(如 Hashtable)的抽象父类,每个键和每个值都是一个对象,在任何一个 Dictionary 对象中,每个键最多和一个值相关联,Map 接口定义了键映射到值的规则,它是一个键值对接口,另外 HashTable 实现了 Serializable 接口和 Cloneable 接口。

2. 继承体系

在这里插入图片描述

3. HashTable 与 HashMap 的区别

  1. 首先,HashMap 是线程不安全,HashTable 是线程安全的。HashMap 的内部实现中没有任何与线程同步相关的代码,所以相对而言性能要好一点。但是如果在多线程中使用 HashMap 的话,需要自己管理线程同步。至于 HashTable,它大部分的对外接口都使用 synchronized 关键字包裹,所以是线程安全的,但是性能会相对差一些。

  2. 其次,二者的基类不一样。HashMap 继承了 AbstractMap 类,HashTable 继承了 Dictionary 类。另外,它们都实现 Map, Cloneable, Serializable 这些接口。AbstractMap 类中提供的基础方法更多,并且实现了多个通用的方法,而 Dictionary 类中只有少量的接口,并且都是 abstract 类型。

  3. 第三,他们的 key 和 value 的取值范围不同。HashMap 的 key 和 value 都可以为 null,但是 HashTable 的 key 和 value 都不能为 null。对于 HashMap,如果 get() 方法返回 null,并不能表明 HashMap 不存在这个 key,如果需要判断 HashMap 中是否包含某个 key,就需要使用 containsKey() 方法来判断。

  4. 再者,他们采用的算法不一样。HashMap 的初始化容量为 16,而 HashTable 的初始化容量为 11。HashMap 中初始容量必须是 2 的整数次幂,如果初始化传入的 initialCapacity 不是 2 的整数次幂,将会自动调整为大于初始化的 initialCapacity 的最小 2 的整数次幂。HashMap 每次扩容都是翻倍,而 HashTable 每次扩容都是变为原来的 2*n+1。HashMap 使用自己的方法计算 hash(会依赖 key 的 hashCode 方法),而 HashTable 是直接使用 key 的 hashCode() 方法得到。

  5. 最后,HashTable 是遗留类,多线程环境下建议可以使用 ConcurrentHashMap。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值