13、哈希表

一、实际需求

有一个公司,当有新的员工来报到时,要求将员工的信息加入(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;
	}

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值