哈希表(hash table)
又称为散列表,通过关键码值,直接访问数据。
数组 + 链表实现哈希表:
package msp.cai.hashtable;
/*
* 数组 + 链表 实现哈希表 --> 存储用户信息
*/
public class HashTableDemo {
public static void main(String[] args) {
UserHashTable userHash = new UserHashTable(5);
userHash.addUser(new User(1,"Tom", 18));
userHash.addUser(new User(2,"Jack", 20));
userHash.addUser(new User(3,"Bob", 21));
userHash.addUser(new User(100,"Adam", 36));
userHash.addUser(new User(200,"York", 60));
userHash.addUser(new User(4,"Zero", 25));
userHash.print();
userHash.searchUser(200);
userHash.deleteUser(200);
userHash.print();
}
}
// 用户类
class User {
int id;
String name;
int age;
User next;
public User(int id, String name, int age) {
this.id = id;
this.name = name;
this.age = age;
}
}
// 用户链表类
class UserLinkedList {
private User head; // 头节点
// 新增节点
public void add(User user) {
// 第一次添加
if (head == null) {
head = user;
return;
}
// 辅助节点,遍历
User temp = head;
while (true) {
if (temp.next == null) {
break;
}
temp = temp.next;
}
temp.next = user;
}
// 打印链表
public void print() {
User temp = head;
if (temp == null) {
return;
}
System.out.print("==>链表: ");
while (true) {
if (temp.next == null) {
System.out.printf("id:%d, name:%s, age:%d", temp.id, temp.name, temp.age);
break;
}
System.out.printf("id:%d, name:%s, age:%d-->", temp.id, temp.name, temp.age);
temp = temp.next;
}
System.out.println();
}
// 查询节点
public User search(int id) {
User temp = head;
if (temp == null) {
return null;
}
while (true) {
if (temp.id == id) {
System.out.printf("找到了,在x中:id=%d,name=%s,age=%d", temp.id, temp.name, temp.age);
System.out.println();
return temp;
}
if (temp.next == null) return null;
temp = temp.next;
}
}
// 删除节点
public void delete(int id) {
User temp = head;
if (temp == null) {
System.out.println("链表为空~");
return;
}
// 若待删除的节点在开头
if (temp.id == id) head = temp.next;
// 若待删除的节点在中间
while (true) {
if (temp.next == null) break;
if (temp.next.id == id) { // 找到该节点的上一个节点
temp.next = temp.next.next; // 完成删除
return;
}
temp = temp.next;
}
}
}
// 用户哈希表
class UserHashTable {
int maxSize;
UserLinkedList[] array;
public UserHashTable(int maxSize) {
this.maxSize = maxSize;
this.array = new UserLinkedList[maxSize];
for (int i = 0; i < maxSize; i++) {
array[i] = new UserLinkedList();
}
}
// 散列函数
public int getId(int id) {
return id % maxSize;
}
// 添加用户, 添加到末尾
public void addUser(User user) {
int link_id = getId(user.id); // 定位在哪条链表
// 判断当前链表中是否已有
User search = array[link_id].search(user.id);
if (search==null) { // 可以添加
array[link_id].add(user);
} else // 已经存在了
System.out.println("抱歉, 该用户已存在~");
}
// 删除用户
public void deleteUser(int id) {
int link_id = getId(id); // 定位在哪条链表
array[link_id].delete(id);
}
// 查询用户
public void searchUser(int id) {
int link_id = getId(id); // 定位在哪条链表
array[link_id].search(id);
}
// 打印哈希表
public void print() {
for (UserLinkedList linkedList : array) {
linkedList.print();
}
}
}