一、基本知识
Hashtable它是一个散列表,它存储的内容是键值对映射。
Hashtale继承于Dictionary,实现了Map、Cloneable、Java.io.Serializable接口。
Hashtable的函数是同步的,这意味着它是线程安全的。它的key、value都不可以为null。此外,Hashtable中的映射不是有序的。
二、优势所在
将数据存储在数组中,并通过数组下标搜索会出现两个问题:
1.如果所有元素是16-bits且不带正负号的整数,我们可以用一个拥有65536个元素的arry A,初值全部为0,每个元素值代表相应元素出现的次数(如果插入元素i,就执行A[i]++,如果删除元素i,就执行A[i]--,如果搜查元素i,就检查A[i]是否为0)。于是,不论是插入、删除、搜索每个操作都在常数时间内完成。但是,若元素是32-bits,我们所准备的arry A的大小就必须是2^32 = 4GB,这就大的不太切合实际。
2.如果元素形态是字符串或其他,而非整数,将无法被拿来作为arry的索引。
此问题的解决:
例如:数值1234是由阿拉伯数字1,2,3,4构成的一样,字符串“jjhou”是由字符‘j’,‘j’,‘h’,‘o’,‘u’构成,那么,既然数值1234是1*10^3+2*10^2+3*10^1+4*10^0,我们也可以将字符编码,每个字符以一个7-bits数值表示(也就是ASCII编码),从而将字符串“jjhou”表现为:
'j'*128^4 + 'j'*128^3 + 'h'*128^2 + 'o'*128^1 + 'u'*128^0
所以,“jjhou”的索引值是:
106*128^4 + 106*128^3 + 104*128^2 + 111*128^1 + 117*128^0 = 28678174709
这是一个非常大的数值,随着字符串长度的增加,数值会更加大,所以这又回归到第一个问题:关于arry的大小。
那么,如何避免使用一个大的荒谬的arry呢?办法之一就