哈希表的实现其实数组+链表,只要掌握了链表的操作写哈希表并不难。
哈希表有一个数组,里面存放的是链表,哈希表会根据一个函数决定把数据存入到哪条链表,并对其操作
首先先实现一个链表
这是一个雇员类:
public class Emp {
public int id;
public String name;
public Emp next;
public Emp(int id, String name) {
this.id = id;
this.name = name;
}
}
这是一条链表:
里面只包含了添加和列举方法,都是链表基本操作
public class EmpList {
//头节点
private Emp head;
/**
* 添加数据
* @param emp
*/
public void add(Emp emp){
if (head == null){
head = emp;
return;
}
Emp temp = head;
if (temp.next == null){
temp.next = emp;
}else {
temp = temp.next;
}
}
/**
* 展示数据
*/
public void List(int id){
if (head == null){
System.out.println("第"+(id+1)+"链表为空");
return;
}
Emp temp = head;
do {
System.out.printf("第"+(id+1)+"条链表=> id=%d name=%s \t",temp.id,temp.name);
temp = temp.next;
}while (temp != null);
System.out.println();
}
}
最后是哈希表:
哈希表里有一个链表数组和一个散列函数,散列函数的实现方法有很多,这里就列举简单的取模。存取数据时由散列函数决定存到哪条链表。
public class HashTable {
private EmpList[] empLists;
private int size;//链表的条数
public HashTable(int size){
this.size = size;
empLists = new EmpList[size];
for (int i=0; i<size; i++){
empLists[i] = new EmpList();
}
}
//添加数据
public void add(Emp emp){
//决定添加进哪条链表
int target = hashFun(emp.id);
empLists[target].add(emp);
}
//遍历所有链表
public void List(){
for (int i=0; i<size; i++){
empLists[i].List(i);
}
}
//散列函数
public int hashFun(int id){
return id % size;
}
}
使用哈希表
public static void main(String[] args) {
HashTable hashTable = new HashTable(5);
hashTable.add(new Emp(1,"aaa"));
hashTable.add(new Emp(2,"bbb"));
hashTable.add(new Emp(3,"ccc"));
hashTable.add(new Emp(4,"ddd"));
hashTable.add(new Emp(5,"eee"));
hashTable.add(new Emp(6,"fff"));
hashTable.List();
}
结果
第1条链表=> id=5 name=eee
第2条链表=> id=1 name=aaa 第2条链表=> id=6 name=fff
第3条链表=> id=2 name=bbb
第4条链表=> id=3 name=ccc
第5条链表=> id=4 name=ddd
Process finished with exit code 0
增删查改的方法定义在EmpList里,也就是链表里,和普通的链表操作没什么区别,HashTable类只是根据散列函数决定对哪一条链表进行操作。