哈希表hash

简介

散列表(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();
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值