一、实际需求
有一个公司,当有新的员工来报到时,要求将员工的信息加入(id、姓名、地址…)。
要求:不要使用数据库,尽量节省内存,速度越快越好。
二、哈希表
散列表(Hash table),又叫哈希表,是根据关键码值(key value)直接访问的数据结构。也就是说,它通过关键码值映射到表中的一个位置来访问记录,以加快查找的速度。这个映射函数也叫散列函数,存放记录的数组也叫散列表。
三、代码
package com.hash;
import java.util.Scanner;
public class HashTableDemo {
public static void main(String[] args) {
HashTable hashTable = new HashTable(7);
Scanner scan = new Scanner(System.in);
while (true) {
System.out.println("add:添加");
System.out.println("show:打印");
System.out.println("exit:退出");
String operate = scan.next();
switch (operate) {
case "add":
System.out.println("id:");
int id = scan.nextInt();
System.out.println("姓名:");
String name = scan.next();
Employee item = new Employee(id, name);
hashTable.add(item);
break;
case "show":
hashTable.show();
break;
case "exit":
scan.close();
System.exit(0);
break;
default:
break;
}
}
}
}
class HashTable {
EmployeeLinkedList[] employeeListArray; // 一个链表数组,每个元素都是一个链表
int size;
public HashTable(int size) {
employeeListArray = new EmployeeLinkedList[size];
// 注意!!!
// 一定要有下面的循环,对employeeListArray数组的每个元素进行初始化
// 因为在上面的数组创建后,数组内的每个元素都为null,并不是一个链表
for (int i = 0; i < size; i++) {
employeeListArray[i] = new EmployeeLinkedList();
}
this.size = size;
}
/**
* 将item添加到哈希表
*
* @param item
*/
public void add(Employee item) {
employeeListArray[hash(item)].add(item);
}
/**
* 打印当前哈希表
*/
public void show() {
for (int i = 0; i < size; i++) {
employeeListArray[i].show(i);
}
}
/**
* @param item
* @return 返回item的哈希值
*/
public int hash(Employee item) {
return item.id % size;
}
}
/**
* 该链表的头节点也存储数据
*
* @author chaixf
*
*/
class EmployeeLinkedList {
// 链表头结点
public Employee head;
/**
* 将item添加到链表
*
* @param item
*/
public void add(Employee item) {
// 如果链表为空,直接将head指向新节点
if (isEmpty()) {
head = item;
return;
}
Employee cur = head; // cur是辅助指针,指向当前节点
while (true) {
if (cur.next == null) {
break;
}
cur = cur.next;// 后移
}
cur.next = item;// 将节点插入链表的尾部
}
public boolean isEmpty() {
return head == null;
}
/**
* 打印
*/
public void show(int i) {
if (isEmpty()) {
System.out.println("第" + i + "条链表为空!");
return;
}
Employee cur = head; // 輔助指針
System.out.print("第" + i + "条链表为:");
// 循环打印每个节点
while (true) {
if (cur == null) {
break;
}
System.out.printf("=> id=%d name=%s\t", cur.id, cur.name);
cur = cur.next;
}
System.out.println();
}
}
/**
* employee节点
*
* @author chaixf
*
*/
class Employee {
public int id;// id
public String name; // 名称
public Employee next; //
public Employee(int id, String name) {
this.id = id;
this.name = name;
}
}