拉链法的散列表是由基于链表的数组实现,它是hashMap的基础数据结构,通过散列函数将加入的键转化为数组索引,存储于数组对应位置的链表内,这个算法的基本思想就是选择足够大的数组大小M,使得所有链表都尽可能短以保证高效的查找,典型以空间换时间的算法,它查找元素分两步:首先根据散列值找到对应的链表,然后沿着链表顺序查找相应的键。
实现代码如下:
public class SeparateChainingHashST<Key, Value> {//基于拉链法的散列表
private int n;//元素数量
private int m;//数组大小
private static final int minCap=9;
private SequentialSearchST<Key,Value>[] st;//基于链表的数组结构,SequentialSearchST是无序链表
public SeparateChainingHashST() {
this(minCap);
}
public SeparateChainingHashST(int cap) {
this.m=cap;
st=(SequentialSearchST<Key,Value>[])new SequentialSearchST[cap];
for(int i=0;i<m;i++)
st[i]=new SequentialSearchST<Key,Value>();
}
public int size() {
return n;
}
public boolean isEmpty() {
return n==0;
}
private int hash(Key key) {
return (key.hashCode()&0x7fffffff)%m;
}
public boolean contains(Key key) {