简介
散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。
代码
1. 创建需要存储的对象
//建立一个用户表
class User {
int id;
User next;
public User(int id) {
this.id = id;
}
}
2. 建立链表存储
//建立链表
class BuildLinkUser {
//创建头节点
User head = new User(-1);
//建立链表
public void build(User user) {
User temp = head;
if(temp.next==null) { //链表为空
head.next = user;
return;
}
while(temp.next!=null) {
temp = temp.next;
}
temp.next = user; //将next指向user
}
//链表删除
public void delete(int id) {
User temp = head;
while(temp.next!=null) {
if(temp.next.id == id) {
break;
}
temp = temp.next;
}
if(temp.next==null) {
System.out.println("查无此用户");
} else {
temp.next = temp.next.next;
}
}
//遍历链表
public void getAll(int id) {
System.out.print(id + "号链表");
User temp = head.next;
if(temp == null) {
System.out.println("为空");
return ;
}
//遍历直到为空
while(temp!=null) {
System.out.print(" " + temp.id);
temp = temp.next;
}
System.out.print("\n");
}
}
3. 建立hash表
//建立hash表
class BuildHash {
BuildLinkUser[] users;
public BuildHash(int size) {
users = new BuildLinkUser[size]; //首先初始化size个数组
//初始化每个数组的值
for(int i=0; i<size; i++) {
users[i] = new BuildLinkUser();
}
}
//建立hash表
public void build(User user) {
//获取通过hash函数转化之后的id值
int hashId = getHashId(user.id);
//将该值添加到下标为hashId的链表中
users[hashId].build(user);
}
//删除用户
public void delete(User user) {
//获取通过hash函数转化之后的id值
int hashId = getHashId(user.id);
//将该值添加到下标为hashId的链表中
users[hashId].delete(user.id);
}
//遍历hash表
public void getAll() {
for(int i=0; i<users.length; i++) {
users[i].getAll(i);
}
}
//确定hash函数为取模运算
public int getHashId(int id) {
return id%7;
}
}
4. 测试
public class HashTable {
public static void main(String[] args) {
User user1 = new User(8);
User user2 = new User(15);
User user3 = new User(22);
User user4 = new User(10);
User user5 = new User(11);
User user6 = new User(17);
User user7 = new User(7);
User user8 = new User(14);
BuildHash hash = new BuildHash(10);
hash.build(user1);
hash.build(user2);
hash.build(user3);
hash.build(user4);
hash.build(user5);
hash.build(user6);
hash.build(user7);
hash.build(user8);
hash.getAll();
System.out.println("---------------------------------------------------------------------------------");
hash.delete(user2);
hash.getAll();
}
}