哈希表是一种重要的存储方式,也是一种常见的检索方法。其基本思想是将关系码的值作为自变量,通过一定的函数关系计算出对应的函数值,把这个数值解释为结点的存储地址,将结点存入计算得到存储地址所对应的存储单元。
检索时采用检索关键码的方法。现在哈希表有一套完整的算法来进行插入、删除和解决冲突。在Java中哈希表用于存储对象,实现快速检索。
Java.util.Hashtable提供了种方法让用户使用哈希表,而不需要考虑其哈希表真正如何工作。哈希表类中提供了三种构造方法,分别是:
public Hashtable()
public Hashtable
(int initialcapacity)
public Hashtable
(int initialCapacity,float loadFactor)
参数initialCapacity是Hashtable的初始容量,它的值应大于0。loadFactor又称装载因子,是一个0.0到0.1之间的 float型的浮点数。它是一个百分比,表明了哈希表何时需要扩充,例如,有一哈希表,容量为100,而装载因子为0.9,那么当哈希表90%的容量已被使用时,此哈希表会自动扩充成一个更大的哈希表。如果用户不赋这些参数,系统会自动进行处理,而不需要用户操心。
Hashtable提供了基本的插入、检索等方法。
插入
public synchronized void put(Object key,Object value)
给对象value设定一关键字key,并将其加到Hashtable中。若此关键字已经存在,则将此关键字对应的旧对象更新为新的对象Value。这表明在哈希表中相同的关键字不可能对应不同的对象(从哈希表的基本思想来看,这也是显而易见的)。
检索
public synchronized Object get(Object key)
根据给定关键字key获取相对应的对象。
public synchronized boolean containsKey(Object key)
判断哈希表中是否包含关键字key。
public synchronized boolean contains(Object value)
判断value是否是哈希表中的一个元素。
删除
public synchronized object remove(object key)
从哈希表中删除关键字key所对应的对象。
public synchronized void clear()
清除哈希表
另外,Hashtalbe还提供方法获取相对应的枚举集合:
public synchronized Enumeration keys()
返回关键字对应的枚举对象。
public synchronized Enumeration elements()
返回元素对应的枚举对象。
例1.5 Hashtable.java给出了使用Hashtable的例子。
例1.5 Hashtalbe.java
//import java.lang.*;
import java.util.Hashtable;
import java.util.Enumeration;
public class HashApp
{
public static void main(String args[])
{
Hashtable hash=new Hashtable(2,(float)0.8);
//创建了一个哈希表的对象hash,
初始容量为2,装载因子为0.8
hash.put("Jiangsu","Nanjing");
//将字符串对象“Jiangsu”
给定一关键字“Nanjing”,并将它加入hash
hash.put("Beijing","Beijing");
hash.put("Zhejiang","Hangzhou");
System.out.println
("The hashtable hash1 is: "+hash);
System.out.println
("The size of this hash table is "
+hash.size());
//打印hash的内容和大小
Enumeration enum1=hash.elements();
System.out.print("The element of hash is: ");
while(enum1.hasMoreElements())
System.out.print(enum1.nextElement()+" ");
System.out.println();
//依次打印hash中的内容
if(hash.containsKey("Jiangsu"))
System.out.println
("The capatial of Jiangsu is "+hash.get("Jiangsu"));
hash.remove("Beijing");
//删除关键字Beijing对应对象
System.out.println
("The hashtable hash2 is: "+hash);
System.out.println
("The size of this hash table is "+hash.size());
}
}
运行结果:
The hashtable hash1 is:
{
Beijing=Beijing,
Zhejiang=Hangzhou,
Jiangsu=Nanjing}
The size of this hash table is 3
The element of hash is:
Beijing Hangzhou Nanjing
The capatial of Jiangsu is Nanjing
The hashtable hash2 is:
{
Zhejiang=Hangzhou, Jiangsu=Nanjing}
The size of this hash table is 2
Hashtable是Dictionary(字典)类的子类。在字典类中就把关键字对应到数据值。字典类是一个抽象类。在java.util中还有一个类Properties,它是Hashtable的子类。用它可以进行与对象属性相关的操作。
附JDK说明:
类 java.util.Hashtable
java.lang.Object
|
+----java.util.Dictionary
|
+----java.util.Hashtable
- public class Hashtable
- extends Dictionary
- implements Cloneable, Serializable
- 下列类的父类:
- Properties
该类实现了一个散列表,它把键映射到值。任何非 null
的对象可用作键或值。
为成功地从散列表中存储和检索对象,用作键的对象必须执行 hashCode
方法和 equals
方法。
一个 Hashtable
的实例有两个参数影响它的效率:它的容量和加载因数。 加载因数应介于 0.0 和 1.0 之间。当散列表的入口数超过加载因数和当前容量的乘积,容量通过调用 rehash
方法增加。更大的加载因数可使得更有效地使用存储器,但这是以每个查找用更大的期望时间为代价的。
如果在 Hashtable
中制造许多入口,对插入操作来说,用一个足够大的容量创建它比让它执行按表生成时所需的自动再散列更有效。
该例子创建了一个数的散列表。它使用数的名字作为键:
Hashtable numbers = new Hashtable();
numbers.put("one", new Integer(1));
numbers.put("two", new Integer(2));
numbers.put("three", new Integer(3));
为了检索一个数,使用下列代码:
Integer n = (Integer)numbers.get("two");
if (n != null) {
System.out.println("two = " + n);
}
- 来自:
- JDK1.0
- 参见:
- equals, hashCode, rehash
构造子索引
- Hashtable()
- 用缺省的容量和加载因数构造一个新的空散列表。
- Hashtable(int)
- 用指定的初始的容量和缺省的加载因数构造一个新的空散列表。
- Hashtable(int, float)
- 用指定的初始的容量和指定的加载因数构造一个新的空散列表。
方法索引
- clear()
- 清除该散列表使它不包含键。
- clone()
- 创建该散列表的影子复制。
- contains(Object)
- 检测在该散列表中某些键是否映射到指定值。
- containsKey(Object)
- 检测指定的对象是否是该散列表中的一个键。
- elements()
- 返回该散列表中的值的一个枚举。
- get(Object)
- 返回指定的键在这个散列表中的映射值。
- isEmpty()
- 检测是否散列表没有把键映射到值。
- keys()
- 返回该散列表中的一个键枚举。
- put(Object, Object)
- 在该散列表中映射指定的
键
到指定的 值
。
- rehash()
- 把散列表再散列到更大容量的散列表中。
- remove(Object)
- 从该散列表中删除键(和它的相应值)。
- size()
- 返回该散列表中的键数。
- toString()
- 返回该散列表的一个相当长的字符串表示。
构造子
Hashtable
public Hashtable(int initialCapacity,
float loadFactor)
- 用指定的初始容量和指定的加载因数构造一个新的空散列表。
-
- 参数:
- initialCapacity - 散列表的初始容量。
- loadFactor - 0.0 和 1.0 之间的一个数。
- 抛出: IllegalArgumentException
- 如果初始容量小于或等于零,或者加载因数小于或等于零。
Hashtable
public Hashtable(int initialCapacity)
- 用指定的初始容量和缺省的加载因数构造一个新的空散列表。
-
- 参数:
- initialCapacity - 散列表的初始容量。
Hashtable
public Hashtable()
- 用缺省的容量和加载因数构造一个新的空散列表。
方法
size
public int size()
- 返回该散列表中的键数。
-
- 返回值:
- 该散列表中的键数。
- 覆盖:
- 类 Dictionary 中的 size
isEmpty
public boolean isEmpty()
- 检测是否散列表没有把键映射到值。
-
- 返回值:
- 为
true
,如果该散列表没有把键映射到值;反之为 false
。
- 覆盖:
- 类 Dictionary 中的 isEmpty
keys
public synchronized Enumeration keys()
- 返回该散列表中的一个键枚举。
-
- 返回值:
- 该散列表中的一个键枚举。
- 覆盖:
- 类 Dictionary 中的 keys
- 参见:
- Enumeration, elements
elements
public synchronized Enumeration elements()
- 返回该散列表中的值的一个枚举。 在返回的对象上使用 Enumeration 方法顺次地或取元素。
-
- 返回值:
- 该散列表中的一个值枚举。
- 覆盖:
- 类 Dictionary 中的 elements
- 参见:
- Enumeration, keys
contains
public synchronized boolean contains(Object value)
- 检测在该散列表中某些键是否映射到指定值。 该操作比
containsKey
方法代价更大。
-
- 参数:
- value - 查找的值。
- 返回值:
- 为
true
,如果某些键映射到该散列表中的值
参数;反之为 false
。
- 抛出: NullPointerException
- 如果值为
null
。
- 参见:
- containsKey
containsKey
public synchronized boolean containsKey(Object key)
- 检测指定的对象是否是该散列表中的一个键。
-
- 参数:
- key - 可能的键。
- 返回值:
- 为
true
,如果指定的对象是该散列表中的一个键;反之为 false
。
- 参见:
- contains
get
public synchronized Object get(Object key)
- 返回指定的键在这个散列表中的映射值。
-
- 参数:
- key - 在该散列表中的一个键。
- 返回值:
- 该键在散列表中的映射值;如果键没有映射到任何值,则返回
null
。
- 覆盖:
- 类 Dictionary 中的 get
- 参见:
- put
rehash
protected void rehash()
- 把散列表再映射到更大容量的散列表中。 该方法在散列表中的键数超过该散列表的容量和加载因数时自动地调用。
put
public synchronized Object put(Object key,
Object value)
- 在该散列表中映射指定的
键
到指定的 值
。 键和值都不能为 null
。
可通过调用 get
方法用与原始键相等的键来检索值。
-
- 参数:
- key - 散列表键。
- value - 值。
- 返回值:
- 该散列表中的指定键的先前的值,如果它没有值时返回
null
。
- 抛出: NullPointerException
- 如果键或值为
null
。
- 覆盖:
- 类 Dictionary 中的 put
- 参见:
- equals, get
remove
public synchronized Object remove(Object key)
- 从该散列表中删除键(和它的相应值)。如果键不在散列表中,则该方法什么都不做。
-
- 参数:
- key - 需要删除的键。
- 返回值:
- 该键在散列表中的映射值;如果键没有映射,则返回
null
。
- 覆盖:
- 类 Dictionary 中的 remove
clear
public synchronized void clear()
- 清除该散列表使它不包含键。
clone
public synchronized Object clone()
- 创建该散列表的影子复制。 键和值本身不复制。这是一个代价高昂的操作。
-
- 返回值:
- 散列表的 clone 。
- 覆盖:
- 类 Object 中的 clone
toString
public synchronized String toString()
- 返回该散列表的一个相当长的字符串表示。
-
- 返回值:
- 该散列表的字符串表示。
- 覆盖:
- 类 Object 中的 toString