现在的位置: 首页 > 综合 > 正文

《java 中的 Hashtable类》

2018年04月18日 ⁄ 综合 ⁄ 共 1895字 ⁄ 字号 评论关闭

 

Hashtable类
前面讲到的集合类是通过下标来确定元素的位置,集合中的对象有一定的顺序,而Hashtable(散列表)却不同,它通过另一种方式来确定对象的位置。它是映射集合的一种实现,提供了将一个对象与另一个对象相关联的方法。

Hashtable是Dictionary类的子类,Dictionary类是抽象类,与查字典操作类似,它要达到通过一个键(key)来查找元素的目的。Hashtable类也是通过键来查找对象,如何确定这个键值呢?首先,散列表为每个对象计算出一个整数,称为散列码,每个对象与其散列码一一对应;然后,用散列码与对象个数进行取模运算,计算出相对应的键。散列表中的对象就是通过这种方式一一放入的,所以在查询对象时,用同样的方式就可以快速定位对象在散列表中的位置。

Hashtable不仅实现了父类的方法,还有自己的方法,如conrainsKey(Object key)。

下面介绍几个常用的方法:

Object put(Object key, Object value)--------将关键字和值插入散列表中。如果key不在散列表

中,返回null。如果key已存在于散列表中,则返回与key相连的前一个值。

Object get(Object key)--------返回包含与key相关联的值的对象。如果key不在散列表中,则返回一个空对象。

Object remove(Object key)--------删除key及其相应的值,返回与key相关联的值。如果key不在散列表中,则返回一个空对象。

boolean conrainsKey(Object key)--------用来检查形参对象是否是一个散列表的键,是则返回

true,否则返回false。

另外,size()方法返回表中元素的个数,isEmply()方法判断表中是否包含有元素。

作为应用散列表的一个典型例子,可考虑用一个程序来检验Java的Math.random()方法的随机性到底如何。在理想情况下,它应该产生一系列完美的随机分布数字。但为了验证这一点,我们需要生成数量众多的随机数字,然后计算落在不同范围内的数字多少。散列表可以极大简化这一工作,因为它能将对象同对象关联起来(此时是将Math.random()生成的值同那些值出现的次数关联起来)。

【例7.14】用Hashtable来检验随机数的随机性。

import java.util.*;

class Counter {

int i = 1;

public String toString() {

return Integer.toString(i);

}

}

class Statistics {

public static void main(String[] args) {

Hashtable ht = new Hashtable();

for(int i = 0; i < 10000; i++) {

// Produce a number between 0 and 20:

Integer r = new Integer((int)(Math.random() * 20));

if(ht.containsKey(r))

((Counter)ht.get(r)).i++;

else

ht.put(r, new Counter());

}

System.out.println(ht);

}

}

在main()中,每次产生一个随机数字,它都会封装到一个Integer对象里,使句柄能够随同散列表一起使用(不可对一个集合使用基本数据类型,只能使用对象句柄)。containKey()方法检查这个键是否已经在集合里(也就是说,那个数字以前发现过吗?)若已在集合里,则get()方法获得那个键关联的值,此时是一个Counter(计数器)对象。计数器内的值i随后会增加1,表明这个特定的随机数字又出现了一次。

假如键以前尚未发现过,那么方法put()仍然会在散列表内置入一个新的“键-值”对。在创建之初,Counter会自己的变量i自动初始化为1,它标志着该随机数字的第一次出现。为显示散列表,只需把它简单地打印出来即可。Hashtable toString()方法能遍历所有键-值对,并为每一对都调用toString()。Integer toString()是事先定义好的,可看到计数器使用的toString。一次运行的结果如下(添加了换行):

{19=526, 18=533, 17=460, 16=513, 15=521, 14=495, 13=512, 12=483, 11=488,

10=487, 9=514, 8=523, 7=497, 6=487, 5=480, 4=489, 3=509, 2=503, 1=475, 0=505}

抱歉!评论已关闭.