散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。
给定表M,存在函数f(key),对任意给定的关键字值key,代入函数后若能得到包含该关键字的记录在表中的地址,则称表M为哈希(Hash)表,函数f(key)为哈希(Hash) 函数。

若关键字为k,则其值存放在f(k)的存储位置上。由此,不需比较便可直接取得所查记录。称这个对应关系f为散列函数,按这个思想建立的表为散列表。
对不同的关键字可能得到同一散列地址,即k1≠k2,而f(k1)=f(k2),这种现象称为冲突(英语:Collision)。具有相同函数值的关键字对该散列函数来说称做同义词。综上所述,根据散列函数f(k)和处理冲突的方法将一组关键字映射到一个有限的连续的地址集(区间)上,并以关键字在地址集中的“像”作为记录在表中的存储位置,这种表便称为散列表,这一映射过程称为散列造表或散列,所得的存储位置称散列地址。
若对于关键字集合中的任一个关键字,经散列函数映象到地址集合中任何一个地址的概率是相等的,则称此类散列函数为均匀散列函数(Uniform Hash function),这就是使关键字经过散列函数得到一个“随机的地址”,从而减少冲突。

class DataItem{
private int iData;
public DataItem(int ii){ iData = ii; }
public int getKey(){ return iData; }
}

class HashTable //定义哈希表
{
private DataItem[] hashArray; // 数组形式
private int arraySize; //哈希表的大小
private DataItem nonItem; // 删除数据时,将被删除的数据设为nonItem
//-------------------------------------------------------------
public HashTable(int size) //构造器,指定哈希表的大小
{
arraySize = size;
hashArray = new DataItem[arraySize];
nonItem = new DataItem(-1); // 把nonItem的关键字设为-1
}
//-------------------------------------------------------------
public void displayTable() //显示哈希表
{
System.out.print("Table: ");
for(int j=0; j<arraySize; j++){
if(hashArray[j] != null) {System.out.print(hashArray[j].getKey() + " ");}
else{System.out.print("** "); }
}

System.out.println("");

}

//-------------------------------------------------------------

public int hashFunc(int key)

{

return key % arraySize; // 哈希函数

}

//-------------------------------------------------------------

public void insert(DataItem item) // 插入数据

// 默认表未满,事实上哈希表是不允许存满的,哈希表的大小比实际存储的数据数要大。

{

int key = item.getKey(); // 获取数据项的关键字,用于计算哈希值

int hashVal = hashFunc(key); // 计算哈希值

                             // 当前位置存有数据并且该数据未被删除

while(hashArray[hashVal] != null &&

               hashArray[hashVal].getKey() != -1)

  {

  ++hashVal;                 // 查找下一个位置

  hashVal %= arraySize;      // 到达表的末尾时,hashVal值变成1,。构成循环,从而可以查找整个表

  }

hashArray[hashVal] = item; // 找到位置

} // end insert()

//-------------------------------------------------------------

public DataItem delete(int key) // 根据关键字删除数据

{

int hashVal = hashFunc(key); // 根据关键字计算哈希值

while(hashArray[hashVal] != null) // 该位置存有数据

  {                               // 两者的关键字是否相同

  if(hashArray[hashVal].getKey() == key)

     {

     DataItem temp = hashArray[hashVal]; // 保存删除的数据项,用于返回

     hashArray[hashVal] = nonItem;       // 删除

     return temp;                        // 返回删除的数据项

     }

  ++hashVal;                 // 关键字不相同,继续查找下一个

  hashVal %= arraySize;      //循环

  }

return null; // 未找到

} // end delete()

//-------------------------------------------------------------

public DataItem find(int key) // 表中是否存在该关键字的数据项

{

int hashVal = hashFunc(key);

while(hashArray[hashVal] != null)

  {                               

  if(hashArray[hashVal].getKey() == key)

     return hashArray[hashVal];   

  ++hashVal;              

  hashVal %= arraySize;      

  }

return null;

}