Hashtable和HashMap,从存储结构和实现来讲基本上都是相同的。它和HashMap的最大的不同是它是线程安全的,另外它不允许key和value为null。Hashtable是个过时的集合类,不建议在新代码中使用,不需要线程安全的场合可以用HashMap替换,需要线程安全的场合可以用ConcurrentHashMap替换。

定义

Hashtable的定义

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

Hashtable的特性

  • Hashtable<K,V>:HashMap是以key-value形式存储数据的
  • extends Dictionary<K,V>:Dictionary 类是一个抽象类,用来存储键/值对,作用和Map类相似。
  • implements Map<K,V>:实现了Map,实现了Map中声明的操作和default方法。
  • implements Cloneable:表明其可以调用clone()方法来返回实例的field-for-field拷贝。
  • implements java.io.Serializable:表明该类是可以序列化的。

构造方法

Hashtable有四个构造方法

  1. Hashtable( int initialCapacity, float loadFactor):使用指定参数初始化容量和指定参数负载因子来构造一个空的hashtable.
  2. Hashtable( int initialCapacity):使用指定参数初始化容量和默认负载因子(0.75)来构造一个空的hashtable.
  3. Hashtable():使用默认初始化容量(11)和默认负载因子(0.75)来构造一个空的hashtable.
  4. Hashtable( Map<? extends K, ? extends V> t):使用指定的键值对集合t来构造hashtable。

核心方法

size()
返回hashtable中key的个数

isEmpty()
判断hashtable中是否有键值对映射.

keys()
返回hashtable中key的枚举.

elements()
返回hashtable中value的枚举.

contains( Object value)
返回hashtable中是否含有指定参数value。

containsValue( Object value)
返回hashtable中是否含有指定参数value。

containsKey( Object key)
判断hashtable是否含有指定参数key

get( Object key)
返回指定参数key映射的value,如果没有对应映射,返回null

put(K key, V value)
添加指定键值对到hashtable中

remove( Object key)
删除hashtable中参数key映射的键值对。如果参数key在hashtable不存在,方法不做任何操作。

putAll( Map<? extends K, ? extends V> t)
将指定t中所有的键值对复制到hashtable中。

clear()、
清空hashtable中所有的键值对

keySet()
返回hashtable中包含的所有key的set视图。

entrySet()
返回hashtable中包含的所有entry的set视图。

values()
返回hashtable中包含的所有value的collection视图。

equals( Object o)
由Map接口的定义比较指定参数和hashtable是否相等。

hashCode()
根据Map接口的定义返回哈希值

Hashtable与HashMap不同点

不同点 HashMap Hashtable
数据结构 数组+链表+红黑树 数组+链表
继承的类不同 继承AbstractMap 继承Dictionary
是否线程安全
性能高低
默认初始化容量 16 11
扩容方式不同 原始容量x2 原始容量x2 + 1
底层数组的容量为2的整数次幂 要求一定为2的整数次幂 不要求
确认key在数组中的索引的方法不同 i = (n - 1) & hash; index = (hash & 0x7FFFFFFF) % tab.length;
遍历方式 Iterator(迭代器) Iterator(迭代器)和Enumeration(枚举器)
Iterator遍历数组顺序 索引从小到大 索引从大到小