哈希表类Hashtable

 哈希表是一种重要的存储方式,也是一种常见的检索方法。其基本思想是将关系码的值作为自变量,通过一定的函数关系计算出对应的函数值,把这个数值解释为结点的存储地址,将结点存入计算得到存储地址所对应的存储单元。

检索时采用检索关键码的方法。现在哈希表有一套完整的算法来进行插入、删除和解决冲突。在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

posted on 2005-08-15 16:33 沉淀 阅读(327) 评论(0)  编辑  收藏

只有注册用户登录后才能发表评论。


网站导航: