注意:哈希表在一定程度上可以看作一个缓存产品,但肯定没有redis…等产品那么强大
面试题
写一个实现:加入员工信息(id,姓名,年龄…),当输入员工id时,查到员工相关信息。要求不使用数据库,尽量节省内存并提高速度。
实现思路:
1. 将员工封装为类作为链表的Node
为每个员工写一个类,其中成员变量即为员工的个人信息,每个员工还应该与下一个员工形成链接关系,将每个员工理解为链表的每一个节点Node。
class Emp {
public int id;
public String name;
public Emp next;
public Emp(int id, String name) {
super();
this.id = id;
this.name = name;
}
}
2. 进行链表的实现
当链表的节点Node(即Emp)写好了后,开始写链表的类,目的是实现每个Node的add()、list()、find()、del()方法。
class EmpLinkedList {
private Emp head;
public void add(Emp emp) {
if(head == null) {
head = emp;
return;
}
Emp curEmp = head;
while(true) {
if(curEmp.next == null) {
break;
}
curEmp = curEmp.next;
}
curEmp.next = emp;
}
public void list(int no) {
if(head == null) {
System.out.println("第 "+(no+1)+" 链表为空");
return;
}
System.out.print("第 "+(no+1)+" 链表的信息为");
Emp curEmp = head;
while(true) {
System.out.printf(" => id=%d name=%s\t", curEmp.id, curEmp.name);
if(curEmp.next == null) {
break;
}
curEmp = curEmp.next;
}
System.out.println();
}
public Emp findEmpById(int id) {
if(head == null) {
System.out.println("链表为空");
return null;
}
Emp curEmp = head;
while(true) {
if(curEmp.id == id) {
break;
}
if(curEmp.next == null) {
curEmp = null;
break;
}
curEmp = curEmp.next;
}
return curEmp;
}
}
3.对链表进行封装,对哈希表进行实现
- 当链表类写好后,应该开始写一个哈希表的类,目的是管理这些链表。其成员变量应该有 上述链表类型的数组(数组中每个元素存一条链表的引用,这就实现了哈希表的结构)。成员变量还可以定义一个size,在构造方法中就可以初始化链表的条数(上述数组的大小)。
- 这个哈希表也应该有add()、list()…等等方法,作为对外的总体封装。
以add()为例子,哈希表中的add()方法也调用了其中每个数组元素(类型为链表)的add()方法,哈希表多做的事情就是多定义一个数组的维度。 - 编写散列函数的作用是把所有员工散列地分配到每一条链表上。思路是除余。
public void add(Emp emp) {
int empLinkedListNO = hashFun(emp.id);
empLinkedListArray[empLinkedListNO].add(emp);
}
总体实现代码如下:
class HashTab {
private EmpLinkedList[] empLinkedListArray;
private int size;
public HashTab(int size) {
this.size = size;
empLinkedListArray = new EmpLinkedList[size];
for(int i = 0; i < size; i++) {
empLinkedListArray[i] = new EmpLinkedList();
}
}
public void add(Emp emp) {
int empLinkedListNO = hashFun(emp.id);
empLinkedListArray[empLinkedListNO].add(emp);
}
public void list() {
for(int i = 0; i < size; i++) {
empLinkedListArray[i].list(i);
}
}
public void findEmpById(int id) {
int empLinkedListNO = hashFun(id);
Emp emp = empLinkedListArray[empLinkedListNO].findEmpById(id);
if(emp != null) {
System.out.printf("在第%d条链表中找到 雇员 id = %d\n", (empLinkedListNO + 1), id);
}else{
System.out.println("在哈希表中,没有找到该雇员~");
}
}
public int hashFun(int id) {
return id % size;
}
}
4.将以上模块进行整合
将以上模块进行整合后,对外部直接就表现为哈希表,直接进行测试就行了。
|