Hashtable简述

时间: 2023-07-10 admin IT培训

Hashtable简述

Hashtable简述

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


  1.  Hashtable 继承于Dictionary,实现了Map、Cloneable、java.io.Serializable接口。
  2. Hashtable 的函数都是同步的,这意味着它是线程安全的(synchronized)。它的key、value都不可以为null。此外,Hashtable中的映射不是有序的。

HashTable在Java中的定义如下:

 从中可以看出HashTable继承Dictionary类,实现Map接口。其中Dictionary类是任何可将键映射到相应值的类(如 Hashtable)的抽象父类。每个键和每个值都是一个对象。在任何一个 Dictionary 对象中,每个键至多与一个值相关联。Map是"key-value键值对"接口。
 

Hashtable成员变量

  • table:一个Entry[]数组类型,而Entry(在 HashMap 中有讲解过)就是一个单向链表。哈希表的”key-value键值对”都是存储在Entry数组中的
  • count:Hashtable的大小,它是Hashtable保存的键值对的数量
  • threshold:Hashtable的阈值,用于判断是否需要调整Hashtable的容量,threshold的值 = (容量 * 负载因子)
  • loadFactor:负载因子
  • modCount:用来实现fail-fast机制的(也就是快速失败)。所谓快速失败就是在并发集合中,其进行迭代操作时,若有其他线程对其进行结构性的修改,这时迭代器会立马感知到,并且立即抛出ConcurrentModificationException异常,而不是等到迭代完成之后才告诉你已经出错了。

Hashtable构造方法

在Hashtabel中存在4个构造函数。

// 默认构造函数。
public Hashtable() // 指定“容量大小”的构造函数
public Hashtable(int initialCapacity) // 指定“容量大小”和“加载因子”的构造函数
public Hashtable(int initialCapacity, float loadFactor) // 包含“子Map”的构造函数
public Hashtable(Map<? extends K, ? extends V> t)
    public Hashtable() {this(11, 0.75f);}
// 默认构造函数,容量为11,加载因子为0.75。

HashMap和HashTable的不同


1、线程的安全性不同
HashMap线程不安全,但是他的效率比HashTable高,大部分都是单线程操作

HashTable线程安全 

2、继承的父类不同
HashMap是继承AbstractMap类 都实现了 map,cloneable serializable 接口

HashTable是继承Dictionary类 都实现了 map,cloneable serializable 接口

3、初始容量大小和每次扩容大小不同
HashTable默认的初始大小为11 每次扩充为2n+1

HashMao默认的初始化大小是16 每次扩充为2倍

4、key和value是否允许为null值
HashTable中,key和value都不能为null

HashMap中,可以允许key和value为空的且存储在数组索引为0处

5、遍历方式不同
Hashtable比HashMap多一个elements方法。